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