xref: /dokuwiki/inc/html.php (revision d868eb89f182718a31113373a6272670bd7f8012)
1ed7b5f09Sandi<?php
215fae107Sandi/**
315fae107Sandi * HTML output functions
415fae107Sandi *
515fae107Sandi * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
615fae107Sandi * @author     Andreas Gohr <andi@splitbrain.org>
715fae107Sandi */
824870174SAndreas Gohruse dokuwiki\Ui\MediaRevisions;
924870174SAndreas Gohruse dokuwiki\Form\Form;
1079a2d784SGerrit Uitslaguse dokuwiki\Action\Denied;
1179a2d784SGerrit Uitslaguse dokuwiki\Action\Locked;
120c3a5702SAndreas Gohruse dokuwiki\ChangeLog\PageChangeLog;
13e1d9dcc8SAndreas Gohruse dokuwiki\Extension\AuthPlugin;
14cbb44eabSAndreas Gohruse dokuwiki\Extension\Event;
1579a2d784SGerrit Uitslaguse dokuwiki\Ui\Backlinks;
1679a2d784SGerrit Uitslaguse dokuwiki\Ui\Editor;
1779a2d784SGerrit Uitslaguse dokuwiki\Ui\Index;
1879a2d784SGerrit Uitslaguse dokuwiki\Ui\Login;
1979a2d784SGerrit Uitslaguse dokuwiki\Ui\PageConflict;
2079a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDiff;
2179a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDraft;
2279a2d784SGerrit Uitslaguse dokuwiki\Ui\PageRevisions;
2379a2d784SGerrit Uitslaguse dokuwiki\Ui\PageView;
2479a2d784SGerrit Uitslaguse dokuwiki\Ui\Recent;
2579a2d784SGerrit Uitslaguse dokuwiki\Ui\UserProfile;
2679a2d784SGerrit Uitslaguse dokuwiki\Ui\UserRegister;
2779a2d784SGerrit Uitslaguse dokuwiki\Ui\UserResendPwd;
2879a2d784SGerrit Uitslaguse dokuwiki\Utf8\Clean;
290c3a5702SAndreas Gohr
302d3b082eSMichael Großeif (!defined('SEC_EDIT_PATTERN')) {
3137c80e0eSLarsDW223    define('SEC_EDIT_PATTERN', '#<!-- EDIT({.*?}) -->#');
322d3b082eSMichael Große}
332d3b082eSMichael Große
346bbae538Sandi
35f3f0262cSandi/**
36f3f0262cSandi * Convenience function to quickly build a wikilink
3715fae107Sandi *
3815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
398d5e837eSMichael Hamann * @param string  $id      id of the target page
408d5e837eSMichael Hamann * @param string  $name    the name of the link, i.e. the text that is displayed
418d5e837eSMichael Hamann * @param string|array  $search  search string(s) that shall be highlighted in the target page
428d5e837eSMichael Hamann * @return string the HTML code of the link
43f3f0262cSandi */
44*d868eb89SAndreas Gohrfunction html_wikilink($id, $name = null, $search = '')
45*d868eb89SAndreas Gohr{
46a8397511SGerrit Uitslag    /** @var Doku_Renderer_xhtml $xhtml_renderer */
47db959ae3SAndreas Gohr    static $xhtml_renderer = null;
48723d78dbSandi    if (is_null($xhtml_renderer)) {
497aea91afSChris Smith        $xhtml_renderer = p_get_renderer('xhtml');
50f3f0262cSandi    }
51f3f0262cSandi
52fe9ec250SChris Smith    return $xhtml_renderer->internallink($id, $name, $search, true, 'navigation');
53f3f0262cSandi}
54f3f0262cSandi
55f3f0262cSandi/**
56f3f0262cSandi * The loginform
5715fae107Sandi *
5815fae107Sandi * @author   Andreas Gohr <andi@splitbrain.org>
59d1d904bbSMichael Große *
60d1d904bbSMichael Große * @param bool $svg Whether to show svg icons in the register and resendpwd links or not
61bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
62f3f0262cSandi */
63*d868eb89SAndreas Gohrfunction html_login($svg = false)
64*d868eb89SAndreas Gohr{
6579a2d784SGerrit Uitslag    dbg_deprecated(Login::class .'::show()');
6624870174SAndreas Gohr    (new Login($svg))->show();
67f3f0262cSandi}
68f3f0262cSandi
69d59dea9fSGerrit Uitslag
70d59dea9fSGerrit Uitslag/**
71d59dea9fSGerrit Uitslag * Denied page content
72d59dea9fSGerrit Uitslag *
737afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Denied::tplContent()
74d59dea9fSGerrit Uitslag */
75*d868eb89SAndreas Gohrfunction html_denied()
76*d868eb89SAndreas Gohr{
7779a2d784SGerrit Uitslag    dbg_deprecated(Denied::class .'::showBanner()');
7824870174SAndreas Gohr    (new Denied())->showBanner();
79d59dea9fSGerrit Uitslag}
80d59dea9fSGerrit Uitslag
81f3f0262cSandi/**
8215fae107Sandi * inserts section edit buttons if wanted or removes the markers
8315fae107Sandi *
8415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
8542ea7f44SGerrit Uitslag *
8642ea7f44SGerrit Uitslag * @param string $text
8742ea7f44SGerrit Uitslag * @param bool   $show show section edit buttons?
8842ea7f44SGerrit Uitslag * @return string
8915fae107Sandi */
90*d868eb89SAndreas Gohrfunction html_secedit($text, $show = true)
91*d868eb89SAndreas Gohr{
92f3f0262cSandi    global $INFO;
9335dae8b0SBen Coburn
94aac83cd4SPhy    if ((isset($INFO) && !$INFO['writable']) || !$show || (isset($INFO) && $INFO['rev'])) {
952d3b082eSMichael Große        return preg_replace(SEC_EDIT_PATTERN, '', $text);
96f3f0262cSandi    }
9735dae8b0SBen Coburn
982d3b082eSMichael Große    return preg_replace_callback(SEC_EDIT_PATTERN,
9940868f2fSAdrian Lang                'html_secedit_button', $text);
10040868f2fSAdrian Lang}
10140868f2fSAdrian Lang
10240868f2fSAdrian Lang/**
10340868f2fSAdrian Lang * prepares section edit button data for event triggering
10440868f2fSAdrian Lang * used as a callback in html_secedit
10540868f2fSAdrian Lang *
10640868f2fSAdrian Lang * @author Andreas Gohr <andi@splitbrain.org>
10742ea7f44SGerrit Uitslag *
10842ea7f44SGerrit Uitslag * @param array $matches matches with regexp
10942ea7f44SGerrit Uitslag * @return string
11042ea7f44SGerrit Uitslag * @triggers HTML_SECEDIT_BUTTON
11140868f2fSAdrian Lang */
112*d868eb89SAndreas Gohrfunction html_secedit_button($matches)
113*d868eb89SAndreas Gohr{
114ada0d779SMichael Hamann    $json = htmlspecialchars_decode($matches[1], ENT_QUOTES);
11524870174SAndreas Gohr    $data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
11696ebed36SAndreas Gohr    if ($data === null) {
11779a2d784SGerrit Uitslag        return '';
11806917fceSMichael Große    }
119ec57f119SLarsDW223    $data['target'] = strtolower($data['target']);
12096ebed36SAndreas Gohr    $data['hid'] = strtolower($data['hid'] ?? '');
12140868f2fSAdrian Lang
12296ebed36SAndreas Gohr    return Event::createAndTrigger(
12396ebed36SAndreas Gohr        'HTML_SECEDIT_BUTTON',
12496ebed36SAndreas Gohr        $data,
12596ebed36SAndreas Gohr        'html_secedit_get_button'
12696ebed36SAndreas Gohr    );
12740868f2fSAdrian Lang}
12840868f2fSAdrian Lang
12940868f2fSAdrian Lang/**
13040868f2fSAdrian Lang * prints a section editing button
13140868f2fSAdrian Lang * used as default action form HTML_SECEDIT_BUTTON
13240868f2fSAdrian Lang *
13340868f2fSAdrian Lang * @author Adrian Lang <lang@cosmocode.de>
13442ea7f44SGerrit Uitslag *
13542ea7f44SGerrit Uitslag * @param array $data name, section id and target
13642ea7f44SGerrit Uitslag * @return string html
13740868f2fSAdrian Lang */
138*d868eb89SAndreas Gohrfunction html_secedit_get_button($data)
139*d868eb89SAndreas Gohr{
14040868f2fSAdrian Lang    global $ID;
14140868f2fSAdrian Lang    global $INFO;
14240868f2fSAdrian Lang
1436d9eab4dSMichael Hamann    if (!isset($data['name']) || $data['name'] === '') return '';
14440868f2fSAdrian Lang
14540868f2fSAdrian Lang    $name = $data['name'];
14640868f2fSAdrian Lang    unset($data['name']);
14740868f2fSAdrian Lang
148905fa971SAdrian Lang    $secid = $data['secid'];
149905fa971SAdrian Lang    unset($data['secid']);
150905fa971SAdrian Lang
1517afe5d93SSatoshi Sahara    $params = array_merge(
15224870174SAndreas Gohr           ['do'  => 'edit', 'rev' => $INFO['lastmod'], 'summary' => '['.$name.'] '],
1537afe5d93SSatoshi Sahara           $data
1547afe5d93SSatoshi Sahara    );
1557afe5d93SSatoshi Sahara
1567afe5d93SSatoshi Sahara    $html = '<div class="secedit editbutton_'.$data['target'] .' editbutton_'.$secid .'">';
1577afe5d93SSatoshi Sahara    $html.= html_btn('secedit', $ID, '', $params, 'post', $name);
1587afe5d93SSatoshi Sahara    $html.= '</div>';
1597afe5d93SSatoshi Sahara    return $html;
160f3f0262cSandi}
161f3f0262cSandi
162f3f0262cSandi/**
163d6c9c552Smatthiasgrimm * Just the back to top button (in its own form)
1646b13307fSandi *
1656b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
16642ea7f44SGerrit Uitslag *
16742ea7f44SGerrit Uitslag * @return string html
1686b13307fSandi */
169*d868eb89SAndreas Gohrfunction html_topbtn()
170*d868eb89SAndreas Gohr{
1716b13307fSandi    global $lang;
1726b13307fSandi
17379a2d784SGerrit Uitslag    return '<a class="nolink" href="#dokuwiki__top">'
1747afe5d93SSatoshi Sahara        .'<button class="button" onclick="window.scrollTo(0, 0)" title="'. $lang['btn_top'] .'">'
1757afe5d93SSatoshi Sahara        . $lang['btn_top']
1767afe5d93SSatoshi Sahara        .'</button></a>';
1776b13307fSandi}
1786b13307fSandi
1796b13307fSandi/**
180d67ca2c0Smatthiasgrimm * Displays a button (using its own form)
18135dae8b0SBen Coburn * If tooltip exists, the access key tooltip is replaced.
18215fae107Sandi *
18315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
18442ea7f44SGerrit Uitslag *
18542ea7f44SGerrit Uitslag * @param string         $name
18642ea7f44SGerrit Uitslag * @param string         $id
18742ea7f44SGerrit Uitslag * @param string         $akey   access key
188e3710957SGerrit Uitslag * @param string[]       $params key-value pairs added as hidden inputs
18942ea7f44SGerrit Uitslag * @param string         $method
19042ea7f44SGerrit Uitslag * @param string         $tooltip
19142ea7f44SGerrit Uitslag * @param bool|string    $label  label text, false: lookup btn_$name in localization
192e824d633SMichael Große * @param string         $svg (optional) svg code, inserted into the button
19342ea7f44SGerrit Uitslag * @return string
194f3f0262cSandi */
195*d868eb89SAndreas Gohrfunction html_btn($name, $id, $akey, $params, $method = 'get', $tooltip = '', $label = false, $svg = null)
196*d868eb89SAndreas Gohr{
197f3f0262cSandi    global $conf;
198f3f0262cSandi    global $lang;
199f3f0262cSandi
200f5baf821SAnika Henke    if (!$label)
201f3f0262cSandi        $label = $lang['btn_'.$name];
202f3f0262cSandi
20349c713a3Sandi    //filter id (without urlencoding)
20449c713a3Sandi    $id = idfilter($id, false);
205f3f0262cSandi
206f3f0262cSandi    //make nice URLs even for buttons
2076c7843b5Sandi    if ($conf['userewrite'] == 2) {
2086c7843b5Sandi        $script = DOKU_BASE.DOKU_SCRIPT.'/'.$id;
2096c7843b5Sandi    } elseif ($conf['userewrite']) {
2106c7843b5Sandi        $script = DOKU_BASE.$id;
2116c7843b5Sandi    } else {
2128b00ebcfSandi        $script = DOKU_BASE.DOKU_SCRIPT;
213f3f0262cSandi        $params['id'] = $id;
214f3f0262cSandi    }
215f3f0262cSandi
2167afe5d93SSatoshi Sahara    $html = '<form class="button btn_'.$name.'" method="'.$method.'" action="'.$script.'"><div class="no">';
217f3f0262cSandi
21806a4bf8fSAndreas Gohr    if (is_array($params)) {
2199e491c01SAndreas Gohr        foreach ($params as $key => $val) {
2207afe5d93SSatoshi Sahara            $html .= '<input type="hidden" name="'.$key.'" value="'.hsc($val).'" />';
221f3f0262cSandi        }
22206a4bf8fSAndreas Gohr    }
223f3f0262cSandi
2247afe5d93SSatoshi Sahara    $tip = empty($tooltip) ? hsc($label) : hsc($tooltip);
22511ea018fSAndreas Gohr
2267afe5d93SSatoshi Sahara    $html .= '<button type="submit" ';
22711ea018fSAndreas Gohr    if ($akey) {
22807493d05SAnika Henke        $tip  .= ' ['.strtoupper($akey).']';
2297afe5d93SSatoshi Sahara        $html .= 'accesskey="'.$akey.'" ';
23035dae8b0SBen Coburn    }
2317afe5d93SSatoshi Sahara    $html .= 'title="'.$tip.'">';
232e824d633SMichael Große    if ($svg) {
2337afe5d93SSatoshi Sahara        $html .= '<span>'. hsc($label) .'</span>'. inlineSVG($svg);
234679dba01SMichael Große    } else {
2357afe5d93SSatoshi Sahara        $html .= hsc($label);
236679dba01SMichael Große    }
2377afe5d93SSatoshi Sahara    $html .= '</button>';
2387afe5d93SSatoshi Sahara    $html .= '</div></form>';
239f3f0262cSandi
2407afe5d93SSatoshi Sahara    return $html;
241f3f0262cSandi}
2420747f5d7Sghi/**
2430747f5d7Sghi * show a revision warning
2440747f5d7Sghi *
2450747f5d7Sghi * @author Szymon Olewniczak <dokuwiki@imz.re>
24687f229e8SSatoshi Sahara * @deprecated 2020-07-18
2470747f5d7Sghi */
248*d868eb89SAndreas Gohrfunction html_showrev()
249*d868eb89SAndreas Gohr{
25079a2d784SGerrit Uitslag    dbg_deprecated(PageView::class .'::showrev()');
2510747f5d7Sghi}
252f3f0262cSandi
253f3f0262cSandi/**
25442ea7f44SGerrit Uitslag * Show a wiki page
25515fae107Sandi *
25615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
25742ea7f44SGerrit Uitslag *
25842ea7f44SGerrit Uitslag * @param null|string $txt wiki text or null for showing $ID
259bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
26015fae107Sandi */
261*d868eb89SAndreas Gohrfunction html_show($txt = null)
262*d868eb89SAndreas Gohr{
26379a2d784SGerrit Uitslag    dbg_deprecated(PageView::class .'::show()');
26424870174SAndreas Gohr    (new PageView($txt))->show();
265f3f0262cSandi}
266f3f0262cSandi
267f3f0262cSandi/**
268ee4c4a1bSAndreas Gohr * ask the user about how to handle an exisiting draft
269ee4c4a1bSAndreas Gohr *
270ee4c4a1bSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
271bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
272ee4c4a1bSAndreas Gohr */
273*d868eb89SAndreas Gohrfunction html_draft()
274*d868eb89SAndreas Gohr{
27579a2d784SGerrit Uitslag    dbg_deprecated(PageDraft::class .'::show()');
27624870174SAndreas Gohr    (new PageDraft)->show();
277ee4c4a1bSAndreas Gohr}
278ee4c4a1bSAndreas Gohr
279ee4c4a1bSAndreas Gohr/**
280f3f0262cSandi * Highlights searchqueries in HTML code
28115fae107Sandi *
28215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
2837209be23SAndreas Gohr * @author Harry Fuecks <hfuecks@gmail.com>
28442ea7f44SGerrit Uitslag *
28542ea7f44SGerrit Uitslag * @param string $html
28642ea7f44SGerrit Uitslag * @param array|string $phrases
28742ea7f44SGerrit Uitslag * @return string html
288f3f0262cSandi */
289*d868eb89SAndreas Gohrfunction html_hilight($html, $phrases)
290*d868eb89SAndreas Gohr{
2918a803caeSAndreas Gohr    $phrases = (array) $phrases;
2928a803caeSAndreas Gohr    $phrases = array_map('preg_quote_cb', $phrases);
2938a803caeSAndreas Gohr    $phrases = array_map('ft_snippet_re_preprocess', $phrases);
2948a803caeSAndreas Gohr    $phrases = array_filter($phrases);
29524870174SAndreas Gohr
29624870174SAndreas Gohr    $regex = implode('|', $phrases);
29760c15d7dSAndreas Gohr
29860c15d7dSAndreas Gohr    if ($regex === '') return $html;
29979a2d784SGerrit Uitslag    if (!Clean::isUtf8($regex)) return $html;
300f3f0262cSandi
30179a2d784SGerrit Uitslag    return @preg_replace_callback("/((<[^>]*)|$regex)/ui", function ($match) {
302675d8ce4SSatoshi Sahara        $hlight = unslash($match[0]);
303675d8ce4SSatoshi Sahara        if (!isset($match[2])) {
304688774a0SAnika Henke            $hlight = '<span class="search_hit">'.$hlight.'</span>';
3057209be23SAndreas Gohr        }
3067209be23SAndreas Gohr        return $hlight;
307675d8ce4SSatoshi Sahara    }, $html);
3087209be23SAndreas Gohr}
3097209be23SAndreas Gohr
3107209be23SAndreas Gohr/**
31115fae107Sandi * Display error on locked pages
31215fae107Sandi *
31315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
3147afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Locked::tplContent()
31515fae107Sandi */
316*d868eb89SAndreas Gohrfunction html_locked()
317*d868eb89SAndreas Gohr{
31879a2d784SGerrit Uitslag    dbg_deprecated(Locked::class .'::showBanner()');
31924870174SAndreas Gohr    (new Locked())->showBanner();
320f3f0262cSandi}
321f3f0262cSandi
32215fae107Sandi/**
32315fae107Sandi * list old revisions
32415fae107Sandi *
32515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
32671726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
3278e69fd30SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
328e0c26282SGerrit Uitslag *
329e0c26282SGerrit Uitslag * @param int $first skip the first n changelog lines
33030a159abSSatoshi Sahara * @param string $media_id id of media, or empty for current page
331bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
33215fae107Sandi */
333*d868eb89SAndreas Gohrfunction html_revisions($first = -1, $media_id = '')
334*d868eb89SAndreas Gohr{
33579a2d784SGerrit Uitslag    dbg_deprecated(PageRevisions::class .'::show()');
336b370ebcdSSatoshi Sahara    if ($media_id) {
33724870174SAndreas Gohr        (new MediaRevisions($media_id))->show($first);
338b370ebcdSSatoshi Sahara    } else {
339b370ebcdSSatoshi Sahara        global $INFO;
34024870174SAndreas Gohr        (new PageRevisions($INFO['id']))->show($first);
341b370ebcdSSatoshi Sahara    }
342f3f0262cSandi}
343f3f0262cSandi
34415fae107Sandi/**
34515fae107Sandi * display recent changes
34615fae107Sandi *
34715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
3485749f1ceSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
34971726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
3508d40b4b6SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
35142ea7f44SGerrit Uitslag *
35242ea7f44SGerrit Uitslag * @param int $first
35342ea7f44SGerrit Uitslag * @param string $show_changes
354bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
35515fae107Sandi */
356*d868eb89SAndreas Gohrfunction html_recent($first = 0, $show_changes = 'both')
357*d868eb89SAndreas Gohr{
35879a2d784SGerrit Uitslag    dbg_deprecated(Recent::class .'::show()');
35924870174SAndreas Gohr    (new Recent($first, $show_changes))->show();
360f3f0262cSandi}
361f3f0262cSandi
36215fae107Sandi/**
36315fae107Sandi * Display page index
36415fae107Sandi *
36515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
36642ea7f44SGerrit Uitslag *
36742ea7f44SGerrit Uitslag * @param string $ns
368bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
36915fae107Sandi */
370*d868eb89SAndreas Gohrfunction html_index($ns)
371*d868eb89SAndreas Gohr{
37279a2d784SGerrit Uitslag    dbg_deprecated(Index::class .'::show()');
37324870174SAndreas Gohr    (new Index($ns))->show();
374f3f0262cSandi}
375f3f0262cSandi
376f3f0262cSandi/**
37789b939d7SSatoshi Sahara * Index tree item formatter for html_buildlist()
37815fae107Sandi *
379f3f0262cSandi * User function for html_buildlist()
38015fae107Sandi *
38115fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
38242ea7f44SGerrit Uitslag *
38342ea7f44SGerrit Uitslag * @param array $item
38442ea7f44SGerrit Uitslag * @return string
3859c8632b4SSatoshi Sahara * @deprecated 2020-07-18
386f3f0262cSandi */
387*d868eb89SAndreas Gohrfunction html_list_index($item)
388*d868eb89SAndreas Gohr{
38979a2d784SGerrit Uitslag    dbg_deprecated(Index::class .'::formatListItem()');
39024870174SAndreas Gohr    return (new Index)->formatListItem($item);
391f3f0262cSandi}
392f3f0262cSandi
393f3f0262cSandi/**
39489b939d7SSatoshi Sahara * Index list item formatter for html_buildlist()
395cb70c441Sandi *
396a1dee2b9SAdrian Lang * This user function is used in html_buildlist to build the
397cb70c441Sandi * <li> tags for namespaces when displaying the page index
398cb70c441Sandi * it gives different classes to opened or closed "folders"
399cb70c441Sandi *
400cb70c441Sandi * @author Andreas Gohr <andi@splitbrain.org>
40142ea7f44SGerrit Uitslag *
40242ea7f44SGerrit Uitslag * @param array $item
40342ea7f44SGerrit Uitslag * @return string html
4049c8632b4SSatoshi Sahara * @deprecated 2020-07-18
405cb70c441Sandi */
406*d868eb89SAndreas Gohrfunction html_li_index($item)
407*d868eb89SAndreas Gohr{
40879a2d784SGerrit Uitslag    dbg_deprecated(Index::class .'::tagListItem()');
40924870174SAndreas Gohr    return (new Index)->tagListItem($item);
410cb70c441Sandi}
411cb70c441Sandi
412cb70c441Sandi/**
41389b939d7SSatoshi Sahara * Default list item formatter for html_buildlist()
41489b939d7SSatoshi Sahara *
41589b939d7SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org>
41689b939d7SSatoshi Sahara *
41789b939d7SSatoshi Sahara * @param array $item
41889b939d7SSatoshi Sahara * @return string html
41989b939d7SSatoshi Sahara * @deprecated 2020-07-18
42089b939d7SSatoshi Sahara */
421*d868eb89SAndreas Gohrfunction html_li_default($item)
422*d868eb89SAndreas Gohr{
42389b939d7SSatoshi Sahara    return '<li class="level'.$item['level'].'">';
42489b939d7SSatoshi Sahara}
42589b939d7SSatoshi Sahara
42689b939d7SSatoshi Sahara/**
42715fae107Sandi * Build an unordered list
42815fae107Sandi *
429f3f0262cSandi * Build an unordered list from the given $data array
430f3f0262cSandi * Each item in the array has to have a 'level' property
431f3f0262cSandi * the item itself gets printed by the given $func user
432cb70c441Sandi * function. The second and optional function is used to
433cb70c441Sandi * print the <li> tag. Both user function need to accept
434cb70c441Sandi * a single item.
43515fae107Sandi *
436c5a8fd96SAndreas Gohr * Both user functions can be given as array to point to
437c5a8fd96SAndreas Gohr * a member of an object.
438c5a8fd96SAndreas Gohr *
43915fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
44080679bafSGerrit Uitslag *
44180679bafSGerrit Uitslag * @param array    $data  array with item arrays
44280679bafSGerrit Uitslag * @param string   $class class of ul wrapper
44380679bafSGerrit Uitslag * @param callable $func  callback to print an list item
444bde560b4SSatoshi Sahara * @param callable $lifunc (optional) callback to the opening li tag
445bde560b4SSatoshi Sahara * @param bool     $forcewrapper (optional) Trigger building a wrapper ul if the first level is
446ae614416SAnika Henke *                               0 (we have a root object) or 1 (just the root content)
44780679bafSGerrit Uitslag * @return string html of an unordered list
448f3f0262cSandi */
449*d868eb89SAndreas Gohrfunction html_buildlist($data, $class, $func, $lifunc = null, $forcewrapper = false)
450*d868eb89SAndreas Gohr{
45124870174SAndreas Gohr    if ($data === []) {
452a1dee2b9SAdrian Lang        return '';
453a1dee2b9SAdrian Lang    }
454a1dee2b9SAdrian Lang
4552689c55fSMichael Große    $firstElement = reset($data);
4562689c55fSMichael Große    $start_level = $firstElement['level'];
4579e4f7880SAdrian Lang    $level = $start_level;
4589c8632b4SSatoshi Sahara    $html  = '';
459434f5921SHakan Sandell    $open  = 0;
4609e4f7880SAdrian Lang
461bde560b4SSatoshi Sahara    // set callback function to build the <li> tag, formerly defined as html_li_default()
462bde560b4SSatoshi Sahara    if (!is_callable($lifunc)) {
46324870174SAndreas Gohr       $lifunc = static fn($item) => '<li class="level'.$item['level'].'">';
464bde560b4SSatoshi Sahara    }
465bde560b4SSatoshi Sahara
466f3f0262cSandi    foreach ($data as $item) {
467f3f0262cSandi        if ($item['level'] > $level) {
468f3f0262cSandi            //open new list
469df52d0feSandi            for ($i = 0; $i < ($item['level'] - $level); $i++) {
4709c8632b4SSatoshi Sahara                if ($i) $html .= '<li class="clear">';
4719c8632b4SSatoshi Sahara                $html .= "\n".'<ul class="'.$class.'">'."\n";
472434f5921SHakan Sandell                $open++;
473df52d0feSandi            }
474434f5921SHakan Sandell            $level = $item['level'];
475434f5921SHakan Sandell
476f3f0262cSandi        } elseif ($item['level'] < $level) {
477f3f0262cSandi            //close last item
4789c8632b4SSatoshi Sahara            $html .= '</li>'."\n";
479434f5921SHakan Sandell            while ($level > $item['level'] && $open > 0 ) {
480f3f0262cSandi                //close higher lists
4819c8632b4SSatoshi Sahara                $html .= '</ul>'."\n".'</li>'."\n";
482434f5921SHakan Sandell                $level--;
483434f5921SHakan Sandell                $open--;
484f3f0262cSandi            }
4859c8632b4SSatoshi Sahara        } elseif ($html !== '') {
48687671313SHakan Sandell            //close previous item
4879c8632b4SSatoshi Sahara            $html .= '</li>'."\n";
488f3f0262cSandi        }
489f3f0262cSandi
490f3f0262cSandi        //print item
4919c8632b4SSatoshi Sahara        $html .= call_user_func($lifunc, $item);
4929c8632b4SSatoshi Sahara        $html .= '<div class="li">';
49334dbe711Schris
4949c8632b4SSatoshi Sahara        $html .= call_user_func($func, $item);
4959c8632b4SSatoshi Sahara        $html .= '</div>';
496f3f0262cSandi    }
497f3f0262cSandi
498f3f0262cSandi    //close remaining items and lists
4999c8632b4SSatoshi Sahara    $html .= '</li>'."\n";
500434f5921SHakan Sandell    while ($open-- > 0) {
5019c8632b4SSatoshi Sahara        $html .= '</ul></li>'."\n";
502434f5921SHakan Sandell    }
503434f5921SHakan Sandell
504434f5921SHakan Sandell    if ($forcewrapper || $start_level < 2) {
505434f5921SHakan Sandell        // Trigger building a wrapper ul if the first level is
506434f5921SHakan Sandell        // 0 (we have a root object) or 1 (just the root content)
5079c8632b4SSatoshi Sahara        $html = "\n".'<ul class="'.$class.'">'."\n".$html.'</ul>'."\n";
508f3f0262cSandi    }
509f3f0262cSandi
5109c8632b4SSatoshi Sahara    return $html;
511f3f0262cSandi}
512f3f0262cSandi
51315fae107Sandi/**
51415fae107Sandi * display backlinks
51515fae107Sandi *
51615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
51711df47ecSMichael Klier * @author Michael Klier <chi@chimeric.de>
518bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
51915fae107Sandi */
520*d868eb89SAndreas Gohrfunction html_backlinks()
521*d868eb89SAndreas Gohr{
52279a2d784SGerrit Uitslag    dbg_deprecated(Backlinks::class .'::show()');
52324870174SAndreas Gohr    (new Backlinks)->show();
52495b451bcSAdrian Lang}
52595b451bcSAdrian Lang
52615fae107Sandi/**
527a215faf2SSatoshi Sahara * Get header of diff HTML
528a215faf2SSatoshi Sahara *
529a215faf2SSatoshi Sahara * @param string $l_rev   Left revisions
530a215faf2SSatoshi Sahara * @param string $r_rev   Right revision
531a215faf2SSatoshi Sahara * @param string $id      Page id, if null $ID is used
532a215faf2SSatoshi Sahara * @param bool   $media   If it is for media files
533a215faf2SSatoshi Sahara * @param bool   $inline  Return the header on a single line
534a215faf2SSatoshi Sahara * @return string[] HTML snippets for diff header
535a215faf2SSatoshi Sahara * @deprecated 2020-07-18
536a215faf2SSatoshi Sahara */
537*d868eb89SAndreas Gohrfunction html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = false)
538*d868eb89SAndreas Gohr{
53979a2d784SGerrit Uitslag    dbg_deprecated('see '. PageDiff::class .'::buildDiffHead()');
54079a2d784SGerrit Uitslag    return ['', '', '', ''];
541a215faf2SSatoshi Sahara}
542a215faf2SSatoshi Sahara
543a215faf2SSatoshi Sahara/**
54404e99fe1SGerrit Uitslag * Show diff
545baf0c3e5SGerrit Uitslag * between current page version and provided $text
546baf0c3e5SGerrit Uitslag * or between the revisions provided via GET or POST
54715fae107Sandi *
54815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
549baf0c3e5SGerrit Uitslag * @param  string $text  when non-empty: compare with this text with most current version
55004e99fe1SGerrit Uitslag * @param  bool   $intro display the intro text
5518d5e837eSMichael Hamann * @param  string $type  type of the diff (inline or sidebyside)
552bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
55315fae107Sandi */
554*d868eb89SAndreas Gohrfunction html_diff($text = '', $intro = true, $type = null)
555*d868eb89SAndreas Gohr{
55679a2d784SGerrit Uitslag    dbg_deprecated(PageDiff::class .'::show()');
557edb50e6aSSatoshi Sahara    global $INFO;
55824870174SAndreas Gohr    (new PageDiff($INFO['id']))->compareWith($text)->preference([
559edb50e6aSSatoshi Sahara        'showIntro' => $intro,
560edb50e6aSSatoshi Sahara        'difftype'  => $type,
561edb50e6aSSatoshi Sahara    ])->show();
562fcfecb69SChristopher Smith}
563fcfecb69SChristopher Smith
56415fae107Sandi/**
565a215faf2SSatoshi Sahara * Create html for revision navigation
566a215faf2SSatoshi Sahara *
567a215faf2SSatoshi Sahara * @param PageChangeLog $pagelog changelog object of current page
568a215faf2SSatoshi Sahara * @param string        $type    inline vs sidebyside
569a215faf2SSatoshi Sahara * @param int           $l_rev   left revision timestamp
570a215faf2SSatoshi Sahara * @param int           $r_rev   right revision timestamp
571a215faf2SSatoshi Sahara * @return string[] html of left and right navigation elements
572a215faf2SSatoshi Sahara * @deprecated 2020-07-18
573a215faf2SSatoshi Sahara */
574*d868eb89SAndreas Gohrfunction html_diff_navigation($pagelog, $type, $l_rev, $r_rev)
575*d868eb89SAndreas Gohr{
57679a2d784SGerrit Uitslag    dbg_deprecated('see '. PageDiff::class .'::buildRevisionsNavigation()');
57779a2d784SGerrit Uitslag    return ['', ''];
578a215faf2SSatoshi Sahara}
579a215faf2SSatoshi Sahara
580a215faf2SSatoshi Sahara/**
581a215faf2SSatoshi Sahara * Create html link to a diff defined by two revisions
582a215faf2SSatoshi Sahara *
583a215faf2SSatoshi Sahara * @param string $difftype display type
584a215faf2SSatoshi Sahara * @param string $linktype
585a215faf2SSatoshi Sahara * @param int $lrev oldest revision
586a215faf2SSatoshi Sahara * @param int $rrev newest revision or null for diff with current revision
587a215faf2SSatoshi Sahara * @return string html of link to a diff
588a215faf2SSatoshi Sahara * @deprecated 2020-07-18
589a215faf2SSatoshi Sahara */
590*d868eb89SAndreas Gohrfunction html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null)
591*d868eb89SAndreas Gohr{
59279a2d784SGerrit Uitslag    dbg_deprecated('see '. PageDiff::class .'::diffViewlink()');
59379a2d784SGerrit Uitslag    return '';
594a215faf2SSatoshi Sahara}
595a215faf2SSatoshi Sahara
596a215faf2SSatoshi Sahara/**
597a215faf2SSatoshi Sahara * Insert soft breaks in diff html
598a215faf2SSatoshi Sahara *
599a215faf2SSatoshi Sahara * @param string $diffhtml
600a215faf2SSatoshi Sahara * @return string
601a215faf2SSatoshi Sahara * @deprecated 2020-07-18
602a215faf2SSatoshi Sahara */
603*d868eb89SAndreas Gohrfunction html_insert_softbreaks($diffhtml)
604*d868eb89SAndreas Gohr{
60579a2d784SGerrit Uitslag    dbg_deprecated(PageDiff::class .'::insertSoftbreaks()');
60624870174SAndreas Gohr    return (new PageDiff)->insertSoftbreaks($diffhtml);
607a215faf2SSatoshi Sahara}
608a215faf2SSatoshi Sahara
609a215faf2SSatoshi Sahara/**
61015fae107Sandi * show warning on conflict detection
61115fae107Sandi *
61215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
61342ea7f44SGerrit Uitslag *
61442ea7f44SGerrit Uitslag * @param string $text
61542ea7f44SGerrit Uitslag * @param string $summary
616bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
61715fae107Sandi */
618*d868eb89SAndreas Gohrfunction html_conflict($text, $summary)
619*d868eb89SAndreas Gohr{
62079a2d784SGerrit Uitslag    dbg_deprecated(PageConflict::class .'::show()');
62124870174SAndreas Gohr    (new PageConflict($text, $summary))->show();
622f3f0262cSandi}
623f3f0262cSandi
624f3f0262cSandi/**
62515fae107Sandi * Prints the global message array
62615fae107Sandi *
62715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
628f3f0262cSandi */
629*d868eb89SAndreas Gohrfunction html_msgarea()
630*d868eb89SAndreas Gohr{
631cc58224cSMichael Hamann    global $MSG, $MSG_shown;
6328d5e837eSMichael Hamann    /** @var array $MSG */
633cc58224cSMichael Hamann    // store if the global $MSG has already been shown and thus HTML output has been started
634cc58224cSMichael Hamann    $MSG_shown = true;
635cc58224cSMichael Hamann
636f3f0262cSandi    if (!isset($MSG)) return;
637f3f0262cSandi
63824870174SAndreas Gohr    $shown = [];
639f3f0262cSandi    foreach ($MSG as $msg) {
6404af9f0d4SAndreas Gohr        $hash = md5($msg['msg']);
6414af9f0d4SAndreas Gohr        if (isset($shown[$hash])) continue; // skip double messages
642f755f9abSChristopher Smith        if (info_msg_allowed($msg)) {
643f3f0262cSandi            print '<div class="'.$msg['lvl'].'">';
644f3f0262cSandi            print $msg['msg'];
645f3f0262cSandi            print '</div>';
646d3bae478SChristopher Smith        }
6474af9f0d4SAndreas Gohr        $shown[$hash] = 1;
648f3f0262cSandi    }
649cc58224cSMichael Hamann
650cc58224cSMichael Hamann    unset($GLOBALS['MSG']);
651f3f0262cSandi}
652f3f0262cSandi
653f3f0262cSandi/**
654f3f0262cSandi * Prints the registration form
65515fae107Sandi *
65615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
657bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
658f3f0262cSandi */
659*d868eb89SAndreas Gohrfunction html_register()
660*d868eb89SAndreas Gohr{
66179a2d784SGerrit Uitslag    dbg_deprecated(UserRegister::class .'::show()');
66224870174SAndreas Gohr    (new UserRegister)->show();
663f3f0262cSandi}
664f3f0262cSandi
665f3f0262cSandi/**
6668b06d178Schris * Print the update profile form
6678b06d178Schris *
6688b06d178Schris * @author Christopher Smith <chris@jalakai.co.uk>
6698b06d178Schris * @author Andreas Gohr <andi@splitbrain.org>
670bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
6718b06d178Schris */
672*d868eb89SAndreas Gohrfunction html_updateprofile()
673*d868eb89SAndreas Gohr{
67479a2d784SGerrit Uitslag    dbg_deprecated(UserProfile::class .'::show()');
67524870174SAndreas Gohr    (new UserProfile)->show();
6768b06d178Schris}
6778b06d178Schris
6788b06d178Schris/**
6797c4635c4SAdrian Lang * Preprocess edit form data
68015fae107Sandi *
68115fae107Sandi * @author   Andreas Gohr <andi@splitbrain.org>
6822ffea8f2SAdrian Lang *
683bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
684f3f0262cSandi */
685*d868eb89SAndreas Gohrfunction html_edit()
686*d868eb89SAndreas Gohr{
68779a2d784SGerrit Uitslag    dbg_deprecated(Editor::class .'::show()');
68824870174SAndreas Gohr    (new Editor)->show();
689b6912aeaSAndreas Gohr}
690b6912aeaSAndreas Gohr
691b6912aeaSAndreas Gohr/**
692bf69f8cbSSatoshi Sahara * Display the default edit form
693bf69f8cbSSatoshi Sahara *
694bf69f8cbSSatoshi Sahara * Is the default action for HTML_EDIT_FORMSELECTION.
695bf69f8cbSSatoshi Sahara *
69679a2d784SGerrit Uitslag * @param array $param
697bf69f8cbSSatoshi Sahara * @deprecated 2020-07-18
698bf69f8cbSSatoshi Sahara */
699*d868eb89SAndreas Gohrfunction html_edit_form($param)
700*d868eb89SAndreas Gohr{
70179a2d784SGerrit Uitslag    dbg_deprecated(Editor::class .'::addTextarea()');
70224870174SAndreas Gohr    (new Editor)->addTextarea($param);
703bf69f8cbSSatoshi Sahara}
704bf69f8cbSSatoshi Sahara
705bf69f8cbSSatoshi Sahara/**
706f3f0262cSandi * prints some debug info
70715fae107Sandi *
70815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
709f3f0262cSandi */
710*d868eb89SAndreas Gohrfunction html_debug()
711*d868eb89SAndreas Gohr{
712f3f0262cSandi    global $conf;
713d16a4edaSandi    global $lang;
714e1d9dcc8SAndreas Gohr    /** @var AuthPlugin $auth */
7155298a619SAndreas Gohr    global $auth;
716100a97e3SAndreas Gohr    global $INFO;
717100a97e3SAndreas Gohr
71828fb55ffSandi    //remove sensitive data
71928fb55ffSandi    $cnf = $conf;
72024297a69SAndreas Gohr    debug_guard($cnf);
721100a97e3SAndreas Gohr    $nfo = $INFO;
72224297a69SAndreas Gohr    debug_guard($nfo);
723100a97e3SAndreas Gohr    $ses = $_SESSION;
72424297a69SAndreas Gohr    debug_guard($ses);
725f3f0262cSandi
726f3f0262cSandi    print '<html><body>';
727f3f0262cSandi
728f3f0262cSandi    print '<p>When reporting bugs please send all the following ';
729f3f0262cSandi    print 'output as a mail to andi@splitbrain.org ';
730f3f0262cSandi    print 'The best way to do this is to save this page in your browser</p>';
731f3f0262cSandi
732100a97e3SAndreas Gohr    print '<b>$INFO:</b><pre>';
733100a97e3SAndreas Gohr    print_r($nfo);
734100a97e3SAndreas Gohr    print '</pre>';
735100a97e3SAndreas Gohr
736f3f0262cSandi    print '<b>$_SERVER:</b><pre>';
737f3f0262cSandi    print_r($_SERVER);
738f3f0262cSandi    print '</pre>';
739f3f0262cSandi
740f3f0262cSandi    print '<b>$conf:</b><pre>';
74128fb55ffSandi    print_r($cnf);
742f3f0262cSandi    print '</pre>';
743f3f0262cSandi
744ed7b5f09Sandi    print '<b>DOKU_BASE:</b><pre>';
745ed7b5f09Sandi    print DOKU_BASE;
746f3f0262cSandi    print '</pre>';
747f3f0262cSandi
748ed7b5f09Sandi    print '<b>abs DOKU_BASE:</b><pre>';
749ed7b5f09Sandi    print DOKU_URL;
750ed7b5f09Sandi    print '</pre>';
751ed7b5f09Sandi
752ed7b5f09Sandi    print '<b>rel DOKU_BASE:</b><pre>';
753f3f0262cSandi    print dirname($_SERVER['PHP_SELF']).'/';
754f3f0262cSandi    print '</pre>';
755f3f0262cSandi
756f3f0262cSandi    print '<b>PHP Version:</b><pre>';
757f3f0262cSandi    print phpversion();
758f3f0262cSandi    print '</pre>';
759f3f0262cSandi
760f3f0262cSandi    print '<b>locale:</b><pre>';
761f3f0262cSandi    print setlocale(LC_ALL, 0);
762f3f0262cSandi    print '</pre>';
763f3f0262cSandi
764d16a4edaSandi    print '<b>encoding:</b><pre>';
765d16a4edaSandi    print $lang['encoding'];
766d16a4edaSandi    print '</pre>';
767d16a4edaSandi
7685298a619SAndreas Gohr    if ($auth) {
7695298a619SAndreas Gohr        print '<b>Auth backend capabilities:</b><pre>';
7702f46ade0SChristopher Smith        foreach ($auth->getCapabilities() as $cando) {
7717afe5d93SSatoshi Sahara            print '   '.str_pad($cando, 16) .' => '. (int)$auth->canDo($cando) . DOKU_LF;
7722f46ade0SChristopher Smith        }
7735298a619SAndreas Gohr        print '</pre>';
7745298a619SAndreas Gohr    }
7755298a619SAndreas Gohr
7763aa54d7cSAndreas Gohr    print '<b>$_SESSION:</b><pre>';
777100a97e3SAndreas Gohr    print_r($ses);
7783aa54d7cSAndreas Gohr    print '</pre>';
7793aa54d7cSAndreas Gohr
780f3f0262cSandi    print '<b>Environment:</b><pre>';
781f3f0262cSandi    print_r($_ENV);
782f3f0262cSandi    print '</pre>';
783f3f0262cSandi
784f3f0262cSandi    print '<b>PHP settings:</b><pre>';
785f3f0262cSandi    $inis = ini_get_all();
786f3f0262cSandi    print_r($inis);
787f3f0262cSandi    print '</pre>';
788f3f0262cSandi
789e89b7c1eSChristopher Smith    if (function_exists('apache_get_version')) {
79024870174SAndreas Gohr        $apache = [];
791e89b7c1eSChristopher Smith        $apache['version'] = apache_get_version();
792e89b7c1eSChristopher Smith
793e89b7c1eSChristopher Smith        if (function_exists('apache_get_modules')) {
794e89b7c1eSChristopher Smith            $apache['modules'] = apache_get_modules();
795e89b7c1eSChristopher Smith        }
796e89b7c1eSChristopher Smith        print '<b>Apache</b><pre>';
797e89b7c1eSChristopher Smith        print_r($apache);
798e89b7c1eSChristopher Smith        print '</pre>';
799e89b7c1eSChristopher Smith    }
800e89b7c1eSChristopher Smith
801f3f0262cSandi    print '</body></html>';
802f3f0262cSandi}
803f3f0262cSandi
80410271ce4SAndreas Gohr/**
8058b06d178Schris * Form to request a new password for an existing account
8068b06d178Schris *
8078b06d178Schris * @author Benoit Chesneau <benoit@bchesneau.info>
808cc204bbdSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de>
809bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
81011e2ce22Schris */
811*d868eb89SAndreas Gohrfunction html_resendpwd()
812*d868eb89SAndreas Gohr{
81379a2d784SGerrit Uitslag    dbg_deprecated(UserResendPwd::class .'::show()');
81424870174SAndreas Gohr    (new UserResendPwd)->show();
815cc204bbdSAndreas Gohr}
816cc204bbdSAndreas Gohr
817fdb8d77bSTom N Harris/**
818b8595a66SAndreas Gohr * Return the TOC rendered to XHTML
819b8595a66SAndreas Gohr *
820b8595a66SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
82142ea7f44SGerrit Uitslag *
82242ea7f44SGerrit Uitslag * @param array $toc
82342ea7f44SGerrit Uitslag * @return string html
824b8595a66SAndreas Gohr */
825*d868eb89SAndreas Gohrfunction html_TOC($toc)
826*d868eb89SAndreas Gohr{
82724870174SAndreas Gohr    if ($toc === []) return '';
828b8595a66SAndreas Gohr    global $lang;
829b8595a66SAndreas Gohr    $out  = '<!-- TOC START -->'.DOKU_LF;
830158a5bffSDeathCamel57    $out .= '<div id="dw__toc" class="dw__toc">'.DOKU_LF;
83148722ac8SAnika Henke    $out .= '<h3 class="toggle">';
832b8595a66SAndreas Gohr    $out .= $lang['toc'];
833d5acc30dSAnika Henke    $out .= '</h3>'.DOKU_LF;
834d5acc30dSAnika Henke    $out .= '<div>'.DOKU_LF;
835bde560b4SSatoshi Sahara    $out .= html_buildlist($toc, 'toc', 'html_list_toc', null, true);
836b8595a66SAndreas Gohr    $out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF;
837b8595a66SAndreas Gohr    $out .= '<!-- TOC END -->'.DOKU_LF;
838db959ae3SAndreas Gohr    return $out;
839db959ae3SAndreas Gohr}
840b8595a66SAndreas Gohr
841b8595a66SAndreas Gohr/**
842b8595a66SAndreas Gohr * Callback for html_buildlist
84342ea7f44SGerrit Uitslag *
84442ea7f44SGerrit Uitslag * @param array $item
84542ea7f44SGerrit Uitslag * @return string html
846b8595a66SAndreas Gohr */
847*d868eb89SAndreas Gohrfunction html_list_toc($item)
848*d868eb89SAndreas Gohr{
849c66972f2SAdrian Lang    if (isset($item['hid'])){
8507d91652aSAndreas Gohr        $link = '#'.$item['hid'];
8517d91652aSAndreas Gohr    } else {
8527d91652aSAndreas Gohr        $link = $item['link'];
8537d91652aSAndreas Gohr    }
8547d91652aSAndreas Gohr
855d5acc30dSAnika Henke    return '<a href="'.$link.'">'.hsc($item['title']).'</a>';
856b8595a66SAndreas Gohr}
857b8595a66SAndreas Gohr
858b8595a66SAndreas Gohr/**
859b8595a66SAndreas Gohr * Helper function to build TOC items
860b8595a66SAndreas Gohr *
861b8595a66SAndreas Gohr * Returns an array ready to be added to a TOC array
862b8595a66SAndreas Gohr *
863b8595a66SAndreas Gohr * @param string $link  - where to link (if $hash set to '#' it's a local anchor)
864b8595a66SAndreas Gohr * @param string $text  - what to display in the TOC
865b8595a66SAndreas Gohr * @param int    $level - nesting level
866b8595a66SAndreas Gohr * @param string $hash  - is prepended to the given $link, set blank if you want full links
8678d5e837eSMichael Hamann * @return array the toc item
868b8595a66SAndreas Gohr */
869*d868eb89SAndreas Gohrfunction html_mktocitem($link, $text, $level, $hash = '#')
870*d868eb89SAndreas Gohr{
87124870174SAndreas Gohr    return  [
872bde560b4SSatoshi Sahara        'link'  => $hash.$link,
873b8595a66SAndreas Gohr        'title' => $text,
874b8595a66SAndreas Gohr        'type'  => 'ul',
875bde560b4SSatoshi Sahara        'level' => $level
87624870174SAndreas Gohr    ];
877b8595a66SAndreas Gohr}
878b8595a66SAndreas Gohr
879b8595a66SAndreas Gohr/**
880fdb8d77bSTom N Harris * Output a Doku_Form object.
881fdb8d77bSTom N Harris * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT
882fdb8d77bSTom N Harris *
883fdb8d77bSTom N Harris * @author Tom N Harris <tnharris@whoopdedo.org>
88442ea7f44SGerrit Uitslag *
8858d5e837eSMichael Hamann * @param string     $name The name of the form
8868d5e837eSMichael Hamann * @param Doku_Form  $form The form
8872162df3aSSatoshi Sahara * @return void
8882162df3aSSatoshi Sahara * @deprecated 2020-07-18
889fdb8d77bSTom N Harris */
890*d868eb89SAndreas Gohrfunction html_form($name, $form)
891*d868eb89SAndreas Gohr{
8928a5f08afSSatoshi Sahara    dbg_deprecated('use dokuwiki\Form\Form instead of Doku_Form');
893fdb8d77bSTom N Harris    // Safety check in case the caller forgets.
894fdb8d77bSTom N Harris    $form->endFieldset();
895cbb44eabSAndreas Gohr    Event::createAndTrigger('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false);
896fdb8d77bSTom N Harris}
897fdb8d77bSTom N Harris
898fdb8d77bSTom N Harris/**
899fdb8d77bSTom N Harris * Form print function.
900c29600d0SSatoshi Sahara * Just calls printForm() on the form object.
90142ea7f44SGerrit Uitslag *
902c29600d0SSatoshi Sahara * @param Doku_Form $form The form
9032162df3aSSatoshi Sahara * @return void
9042162df3aSSatoshi Sahara * @deprecated 2020-07-18
905fdb8d77bSTom N Harris */
906*d868eb89SAndreas Gohrfunction html_form_output($form)
907*d868eb89SAndreas Gohr{
90824870174SAndreas Gohr    dbg_deprecated('use ' . Form::class . '::toHTML()');
90925dd2a2fSSatoshi Sahara    $form->printForm();
91025dd2a2fSSatoshi Sahara}
911340756e4Sandi
91207bf32b2SAndreas Gohr/**
91307bf32b2SAndreas Gohr * Embed a flash object in HTML
91407bf32b2SAndreas Gohr *
91507bf32b2SAndreas Gohr * This will create the needed HTML to embed a flash movie in a cross browser
91607bf32b2SAndreas Gohr * compatble way using valid XHTML
91707bf32b2SAndreas Gohr *
91807bf32b2SAndreas Gohr * The parameters $params, $flashvars and $atts need to be associative arrays.
91907bf32b2SAndreas Gohr * No escaping needs to be done for them. The alternative content *has* to be
92007bf32b2SAndreas Gohr * escaped because it is used as is. If no alternative content is given
92107bf32b2SAndreas Gohr * $lang['noflash'] is used.
92207bf32b2SAndreas Gohr *
92307bf32b2SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
92407bf32b2SAndreas Gohr * @link   http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml
92507bf32b2SAndreas Gohr *
92607bf32b2SAndreas Gohr * @param string $swf      - the SWF movie to embed
92707bf32b2SAndreas Gohr * @param int $width       - width of the flash movie in pixels
92807bf32b2SAndreas Gohr * @param int $height      - height of the flash movie in pixels
92907bf32b2SAndreas Gohr * @param array $params    - additional parameters (<param>)
93007bf32b2SAndreas Gohr * @param array $flashvars - parameters to be passed in the flashvar parameter
93107bf32b2SAndreas Gohr * @param array $atts      - additional attributes for the <object> tag
93207bf32b2SAndreas Gohr * @param string $alt      - alternative content (is NOT automatically escaped!)
933b3d1090eSMichael Hamann * @return string         - the XHTML markup
93407bf32b2SAndreas Gohr */
935*d868eb89SAndreas Gohrfunction html_flashobject($swf, $width, $height, $params = null, $flashvars = null, $atts = null, $alt = '')
936*d868eb89SAndreas Gohr{
93707bf32b2SAndreas Gohr    global $lang;
93807bf32b2SAndreas Gohr
93907bf32b2SAndreas Gohr    $out = '';
94007bf32b2SAndreas Gohr
94107bf32b2SAndreas Gohr    // prepare the object attributes
94224870174SAndreas Gohr    if(is_null($atts)) $atts = [];
94307bf32b2SAndreas Gohr    $atts['width']  = (int) $width;
944d4c61e61SAndreas Gohr    $atts['height'] = (int) $height;
94507bf32b2SAndreas Gohr    if(!$atts['width'])  $atts['width']  = 425;
94607bf32b2SAndreas Gohr    if(!$atts['height']) $atts['height'] = 350;
94707bf32b2SAndreas Gohr
94807bf32b2SAndreas Gohr    // add object attributes for standard compliant browsers
94907bf32b2SAndreas Gohr    $std = $atts;
95007bf32b2SAndreas Gohr    $std['type'] = 'application/x-shockwave-flash';
95107bf32b2SAndreas Gohr    $std['data'] = $swf;
95207bf32b2SAndreas Gohr
95307bf32b2SAndreas Gohr    // add object attributes for IE
95407bf32b2SAndreas Gohr    $ie  = $atts;
95507bf32b2SAndreas Gohr    $ie['classid'] = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
95607bf32b2SAndreas Gohr
95707bf32b2SAndreas Gohr    // open object (with conditional comments)
95807bf32b2SAndreas Gohr    $out .= '<!--[if !IE]> -->'.NL;
95907bf32b2SAndreas Gohr    $out .= '<object '.buildAttributes($std).'>'.NL;
96007bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->'.NL;
96107bf32b2SAndreas Gohr    $out .= '<!--[if IE]>'.NL;
96207bf32b2SAndreas Gohr    $out .= '<object '.buildAttributes($ie).'>'.NL;
96307bf32b2SAndreas Gohr    $out .= '    <param name="movie" value="'.hsc($swf).'" />'.NL;
9649ae41cdcSAndreas Gohr    $out .= '<!--><!-- -->'.NL;
96507bf32b2SAndreas Gohr
96607bf32b2SAndreas Gohr    // print params
96707bf32b2SAndreas Gohr    if(is_array($params)) foreach($params as $key => $val){
96807bf32b2SAndreas Gohr        $out .= '  <param name="'.hsc($key).'" value="'.hsc($val).'" />'.NL;
96907bf32b2SAndreas Gohr    }
97007bf32b2SAndreas Gohr
97107bf32b2SAndreas Gohr    // add flashvars
97207bf32b2SAndreas Gohr    if(is_array($flashvars)){
973d4c61e61SAndreas Gohr        $out .= '  <param name="FlashVars" value="'.buildURLparams($flashvars).'" />'.NL;
97407bf32b2SAndreas Gohr    }
97507bf32b2SAndreas Gohr
97607bf32b2SAndreas Gohr    // alternative content
97707bf32b2SAndreas Gohr    if($alt){
97807bf32b2SAndreas Gohr        $out .= $alt.NL;
97907bf32b2SAndreas Gohr    }else{
98007bf32b2SAndreas Gohr        $out .= $lang['noflash'].NL;
98107bf32b2SAndreas Gohr    }
98207bf32b2SAndreas Gohr
98307bf32b2SAndreas Gohr    // finish
98407bf32b2SAndreas Gohr    $out .= '</object>'.NL;
98507bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->'.NL;
98607bf32b2SAndreas Gohr
98707bf32b2SAndreas Gohr    return $out;
98807bf32b2SAndreas Gohr}
98907bf32b2SAndreas Gohr
9908d5e837eSMichael Hamann/**
9918d5e837eSMichael Hamann * Prints HTML code for the given tab structure
9928d5e837eSMichael Hamann *
9938d5e837eSMichael Hamann * @param array  $tabs        tab structure
9948d5e837eSMichael Hamann * @param string $current_tab the current tab id
9952162df3aSSatoshi Sahara * @return void
9968d5e837eSMichael Hamann */
997*d868eb89SAndreas Gohrfunction html_tabs($tabs, $current_tab = null)
998*d868eb89SAndreas Gohr{
99994add303SAnika Henke    echo '<ul class="tabs">'.NL;
100095b451bcSAdrian Lang
100195b451bcSAdrian Lang    foreach ($tabs as $id => $tab) {
100295b451bcSAdrian Lang        html_tab($tab['href'], $tab['caption'], $id === $current_tab);
100395b451bcSAdrian Lang    }
100495b451bcSAdrian Lang
100594add303SAnika Henke    echo '</ul>'.NL;
100695b451bcSAdrian Lang}
1007cd2a4cfdSAnika Henke
100895b451bcSAdrian Lang/**
100995b451bcSAdrian Lang * Prints a single tab
101095b451bcSAdrian Lang *
101195b451bcSAdrian Lang * @author Kate Arzamastseva <pshns@ukr.net>
101295b451bcSAdrian Lang * @author Adrian Lang <mail@adrianlang.de>
101395b451bcSAdrian Lang *
101495b451bcSAdrian Lang * @param string $href - tab href
101595b451bcSAdrian Lang * @param string $caption - tab caption
101695b451bcSAdrian Lang * @param boolean $selected - is tab selected
10172162df3aSSatoshi Sahara * @return void
101895b451bcSAdrian Lang */
101995b451bcSAdrian Lang
1020*d868eb89SAndreas Gohrfunction html_tab($href, $caption, $selected = false)
1021*d868eb89SAndreas Gohr{
102295b451bcSAdrian Lang    $tab = '<li>';
102395b451bcSAdrian Lang    if ($selected) {
102495b451bcSAdrian Lang        $tab .= '<strong>';
102595b451bcSAdrian Lang    } else {
102695b451bcSAdrian Lang        $tab .= '<a href="' . hsc($href) . '">';
102795b451bcSAdrian Lang    }
102895b451bcSAdrian Lang    $tab .= hsc($caption)
102995b451bcSAdrian Lang         .  '</' . ($selected ? 'strong' : 'a') . '>'
103094add303SAnika Henke         .  '</li>'.NL;
103195b451bcSAdrian Lang    echo $tab;
103295b451bcSAdrian Lang}
103395b451bcSAdrian Lang
1034cd2a4cfdSAnika Henke/**
1035cd2a4cfdSAnika Henke * Display size change
1036cd2a4cfdSAnika Henke *
1037cd2a4cfdSAnika Henke * @param int $sizechange - size of change in Bytes
1038e34d6962SSatoshi Sahara * @param Doku_Form $form - (optional) form to add elements to
1039e34d6962SSatoshi Sahara * @return void|string
1040cd2a4cfdSAnika Henke */
1041*d868eb89SAndreas Gohrfunction html_sizechange($sizechange, $form = null)
1042*d868eb89SAndreas Gohr{
1043cd2a4cfdSAnika Henke    if (isset($sizechange)) {
1044cd2a4cfdSAnika Henke        $class = 'sizechange';
1045cd2a4cfdSAnika Henke        $value = filesize_h(abs($sizechange));
1046cd2a4cfdSAnika Henke        if ($sizechange > 0) {
1047cd2a4cfdSAnika Henke            $class .= ' positive';
1048cd2a4cfdSAnika Henke            $value = '+' . $value;
1049cd2a4cfdSAnika Henke        } elseif ($sizechange < 0) {
1050cd2a4cfdSAnika Henke            $class .= ' negative';
1051cd2a4cfdSAnika Henke            $value = '-' . $value;
10520b78a6edSAnika Henke        } else {
10530b78a6edSAnika Henke            $value = '±' . $value;
1054cd2a4cfdSAnika Henke        }
1055e34d6962SSatoshi Sahara        if (!isset($form)) {
1056e34d6962SSatoshi Sahara            return '<span class="'.$class.'">'.$value.'</span>';
1057b0f23f4eSSatoshi Sahara        } else { // Doku_Form
105824870174SAndreas Gohr            $form->addElement(form_makeOpenTag('span', ['class' => $class]));
1059cd2a4cfdSAnika Henke            $form->addElement($value);
1060cd2a4cfdSAnika Henke            $form->addElement(form_makeCloseTag('span'));
1061cd2a4cfdSAnika Henke        }
1062cd2a4cfdSAnika Henke    }
1063b0f23f4eSSatoshi Sahara}
1064