xref: /dokuwiki/inc/html.php (revision dccd6b2bba7367e4d1d2d7aa84c9f9d15584b593)
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
98*dccd6b2bSAndreas Gohr    return preg_replace_callback(
99*dccd6b2bSAndreas Gohr        SEC_EDIT_PATTERN,
100*dccd6b2bSAndreas Gohr        'html_secedit_button',
101*dccd6b2bSAndreas Gohr        $text
102*dccd6b2bSAndreas 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);
11824870174SAndreas Gohr    $data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
11996ebed36SAndreas Gohr    if ($data === null) {
12079a2d784SGerrit Uitslag        return '';
12106917fceSMichael Große    }
122ec57f119SLarsDW223    $data['target'] = strtolower($data['target']);
12396ebed36SAndreas Gohr    $data['hid'] = strtolower($data['hid'] ?? '');
12440868f2fSAdrian Lang
12596ebed36SAndreas Gohr    return Event::createAndTrigger(
12696ebed36SAndreas Gohr        'HTML_SECEDIT_BUTTON',
12796ebed36SAndreas Gohr        $data,
12896ebed36SAndreas Gohr        'html_secedit_get_button'
12996ebed36SAndreas Gohr    );
13040868f2fSAdrian Lang}
13140868f2fSAdrian Lang
13240868f2fSAdrian Lang/**
13340868f2fSAdrian Lang * prints a section editing button
13440868f2fSAdrian Lang * used as default action form HTML_SECEDIT_BUTTON
13540868f2fSAdrian Lang *
13640868f2fSAdrian Lang * @author Adrian Lang <lang@cosmocode.de>
13742ea7f44SGerrit Uitslag *
13842ea7f44SGerrit Uitslag * @param array $data name, section id and target
13942ea7f44SGerrit Uitslag * @return string html
14040868f2fSAdrian Lang */
141d868eb89SAndreas Gohrfunction html_secedit_get_button($data)
142d868eb89SAndreas Gohr{
14340868f2fSAdrian Lang    global $ID;
14440868f2fSAdrian Lang    global $INFO;
14540868f2fSAdrian Lang
1466d9eab4dSMichael Hamann    if (!isset($data['name']) || $data['name'] === '') return '';
14740868f2fSAdrian Lang
14840868f2fSAdrian Lang    $name = $data['name'];
14940868f2fSAdrian Lang    unset($data['name']);
15040868f2fSAdrian Lang
151905fa971SAdrian Lang    $secid = $data['secid'];
152905fa971SAdrian Lang    unset($data['secid']);
153905fa971SAdrian Lang
1547afe5d93SSatoshi Sahara    $params = array_merge(
15524870174SAndreas Gohr        ['do'  => 'edit', 'rev' => $INFO['lastmod'], 'summary' => '['.$name.'] '],
1567afe5d93SSatoshi Sahara        $data
1577afe5d93SSatoshi Sahara    );
1587afe5d93SSatoshi Sahara
1597afe5d93SSatoshi Sahara    $html = '<div class="secedit editbutton_'.$data['target'] .' editbutton_'.$secid .'">';
1607afe5d93SSatoshi Sahara    $html.= html_btn('secedit', $ID, '', $params, 'post', $name);
1617afe5d93SSatoshi Sahara    $html.= '</div>';
1627afe5d93SSatoshi Sahara    return $html;
163f3f0262cSandi}
164f3f0262cSandi
165f3f0262cSandi/**
166d6c9c552Smatthiasgrimm * Just the back to top button (in its own form)
1676b13307fSandi *
1686b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
16942ea7f44SGerrit Uitslag *
17042ea7f44SGerrit Uitslag * @return string html
1716b13307fSandi */
172d868eb89SAndreas Gohrfunction html_topbtn()
173d868eb89SAndreas Gohr{
1746b13307fSandi    global $lang;
1756b13307fSandi
17679a2d784SGerrit Uitslag    return '<a class="nolink" href="#dokuwiki__top">'
1777afe5d93SSatoshi Sahara        .'<button class="button" onclick="window.scrollTo(0, 0)" title="'. $lang['btn_top'] .'">'
1787afe5d93SSatoshi Sahara        . $lang['btn_top']
1797afe5d93SSatoshi Sahara        .'</button></a>';
1806b13307fSandi}
1816b13307fSandi
1826b13307fSandi/**
183d67ca2c0Smatthiasgrimm * Displays a button (using its own form)
18435dae8b0SBen Coburn * If tooltip exists, the access key tooltip is replaced.
18515fae107Sandi *
18615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
18742ea7f44SGerrit Uitslag *
18842ea7f44SGerrit Uitslag * @param string         $name
18942ea7f44SGerrit Uitslag * @param string         $id
19042ea7f44SGerrit Uitslag * @param string         $akey   access key
191e3710957SGerrit Uitslag * @param string[]       $params key-value pairs added as hidden inputs
19242ea7f44SGerrit Uitslag * @param string         $method
19342ea7f44SGerrit Uitslag * @param string         $tooltip
19442ea7f44SGerrit Uitslag * @param bool|string    $label  label text, false: lookup btn_$name in localization
195e824d633SMichael Große * @param string         $svg (optional) svg code, inserted into the button
19642ea7f44SGerrit Uitslag * @return string
197f3f0262cSandi */
198d868eb89SAndreas Gohrfunction html_btn($name, $id, $akey, $params, $method = 'get', $tooltip = '', $label = false, $svg = null)
199d868eb89SAndreas Gohr{
200f3f0262cSandi    global $conf;
201f3f0262cSandi    global $lang;
202f3f0262cSandi
203f5baf821SAnika Henke    if (!$label)
204f3f0262cSandi        $label = $lang['btn_'.$name];
205f3f0262cSandi
20649c713a3Sandi    //filter id (without urlencoding)
20749c713a3Sandi    $id = idfilter($id, false);
208f3f0262cSandi
209f3f0262cSandi    //make nice URLs even for buttons
2106c7843b5Sandi    if ($conf['userewrite'] == 2) {
2116c7843b5Sandi        $script = DOKU_BASE.DOKU_SCRIPT.'/'.$id;
2126c7843b5Sandi    } elseif ($conf['userewrite']) {
2136c7843b5Sandi        $script = DOKU_BASE.$id;
2146c7843b5Sandi    } else {
2158b00ebcfSandi        $script = DOKU_BASE.DOKU_SCRIPT;
216f3f0262cSandi        $params['id'] = $id;
217f3f0262cSandi    }
218f3f0262cSandi
2197afe5d93SSatoshi Sahara    $html = '<form class="button btn_'.$name.'" method="'.$method.'" action="'.$script.'"><div class="no">';
220f3f0262cSandi
22106a4bf8fSAndreas Gohr    if (is_array($params)) {
2229e491c01SAndreas Gohr        foreach ($params as $key => $val) {
2237afe5d93SSatoshi Sahara            $html .= '<input type="hidden" name="'.$key.'" value="'.hsc($val).'" />';
224f3f0262cSandi        }
22506a4bf8fSAndreas Gohr    }
226f3f0262cSandi
2277afe5d93SSatoshi Sahara    $tip = empty($tooltip) ? hsc($label) : hsc($tooltip);
22811ea018fSAndreas Gohr
2297afe5d93SSatoshi Sahara    $html .= '<button type="submit" ';
23011ea018fSAndreas Gohr    if ($akey) {
23107493d05SAnika Henke        $tip  .= ' ['.strtoupper($akey).']';
2327afe5d93SSatoshi Sahara        $html .= 'accesskey="'.$akey.'" ';
23335dae8b0SBen Coburn    }
2347afe5d93SSatoshi Sahara    $html .= 'title="'.$tip.'">';
235e824d633SMichael Große    if ($svg) {
2367afe5d93SSatoshi Sahara        $html .= '<span>'. hsc($label) .'</span>'. inlineSVG($svg);
237679dba01SMichael Große    } else {
2387afe5d93SSatoshi Sahara        $html .= hsc($label);
239679dba01SMichael Große    }
2407afe5d93SSatoshi Sahara    $html .= '</button>';
2417afe5d93SSatoshi Sahara    $html .= '</div></form>';
242f3f0262cSandi
2437afe5d93SSatoshi Sahara    return $html;
244f3f0262cSandi}
2450747f5d7Sghi/**
2460747f5d7Sghi * show a revision warning
2470747f5d7Sghi *
2480747f5d7Sghi * @author Szymon Olewniczak <dokuwiki@imz.re>
24987f229e8SSatoshi Sahara * @deprecated 2020-07-18
2500747f5d7Sghi */
251d868eb89SAndreas Gohrfunction html_showrev()
252d868eb89SAndreas Gohr{
25379a2d784SGerrit Uitslag    dbg_deprecated(PageView::class .'::showrev()');
2540747f5d7Sghi}
255f3f0262cSandi
256f3f0262cSandi/**
25742ea7f44SGerrit Uitslag * Show a wiki page
25815fae107Sandi *
25915fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
26042ea7f44SGerrit Uitslag *
26142ea7f44SGerrit Uitslag * @param null|string $txt wiki text or null for showing $ID
262bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
26315fae107Sandi */
264d868eb89SAndreas Gohrfunction html_show($txt = null)
265d868eb89SAndreas Gohr{
26679a2d784SGerrit Uitslag    dbg_deprecated(PageView::class .'::show()');
26724870174SAndreas Gohr    (new PageView($txt))->show();
268f3f0262cSandi}
269f3f0262cSandi
270f3f0262cSandi/**
271ee4c4a1bSAndreas Gohr * ask the user about how to handle an exisiting draft
272ee4c4a1bSAndreas Gohr *
273ee4c4a1bSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
274bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
275ee4c4a1bSAndreas Gohr */
276d868eb89SAndreas Gohrfunction html_draft()
277d868eb89SAndreas Gohr{
27879a2d784SGerrit Uitslag    dbg_deprecated(PageDraft::class .'::show()');
27973022918SAndreas Gohr    (new PageDraft())->show();
280ee4c4a1bSAndreas Gohr}
281ee4c4a1bSAndreas Gohr
282ee4c4a1bSAndreas Gohr/**
283f3f0262cSandi * Highlights searchqueries in HTML code
28415fae107Sandi *
28515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
2867209be23SAndreas Gohr * @author Harry Fuecks <hfuecks@gmail.com>
28742ea7f44SGerrit Uitslag *
28842ea7f44SGerrit Uitslag * @param string $html
28942ea7f44SGerrit Uitslag * @param array|string $phrases
29042ea7f44SGerrit Uitslag * @return string html
291f3f0262cSandi */
292d868eb89SAndreas Gohrfunction html_hilight($html, $phrases)
293d868eb89SAndreas Gohr{
2948a803caeSAndreas Gohr    $phrases = (array) $phrases;
2958a803caeSAndreas Gohr    $phrases = array_map('preg_quote_cb', $phrases);
2968a803caeSAndreas Gohr    $phrases = array_map('ft_snippet_re_preprocess', $phrases);
2978a803caeSAndreas Gohr    $phrases = array_filter($phrases);
29824870174SAndreas Gohr
29924870174SAndreas Gohr    $regex = implode('|', $phrases);
30060c15d7dSAndreas Gohr
30160c15d7dSAndreas Gohr    if ($regex === '') return $html;
30279a2d784SGerrit Uitslag    if (!Clean::isUtf8($regex)) return $html;
303f3f0262cSandi
30479a2d784SGerrit Uitslag    return @preg_replace_callback("/((<[^>]*)|$regex)/ui", function ($match) {
305675d8ce4SSatoshi Sahara        $hlight = unslash($match[0]);
306675d8ce4SSatoshi Sahara        if (!isset($match[2])) {
307688774a0SAnika Henke            $hlight = '<span class="search_hit">'.$hlight.'</span>';
3087209be23SAndreas Gohr        }
3097209be23SAndreas Gohr        return $hlight;
310675d8ce4SSatoshi Sahara    }, $html);
3117209be23SAndreas Gohr}
3127209be23SAndreas Gohr
3137209be23SAndreas Gohr/**
31415fae107Sandi * Display error on locked pages
31515fae107Sandi *
31615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
3177afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Locked::tplContent()
31815fae107Sandi */
319d868eb89SAndreas Gohrfunction html_locked()
320d868eb89SAndreas Gohr{
32179a2d784SGerrit Uitslag    dbg_deprecated(Locked::class .'::showBanner()');
32224870174SAndreas Gohr    (new Locked())->showBanner();
323f3f0262cSandi}
324f3f0262cSandi
32515fae107Sandi/**
32615fae107Sandi * list old revisions
32715fae107Sandi *
32815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
32971726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
3308e69fd30SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
331e0c26282SGerrit Uitslag *
332e0c26282SGerrit Uitslag * @param int $first skip the first n changelog lines
33330a159abSSatoshi Sahara * @param string $media_id id of media, or empty for current page
334bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
33515fae107Sandi */
336d868eb89SAndreas Gohrfunction html_revisions($first = -1, $media_id = '')
337d868eb89SAndreas Gohr{
33879a2d784SGerrit Uitslag    dbg_deprecated(PageRevisions::class .'::show()');
339b370ebcdSSatoshi Sahara    if ($media_id) {
34024870174SAndreas Gohr        (new MediaRevisions($media_id))->show($first);
341b370ebcdSSatoshi Sahara    } else {
342b370ebcdSSatoshi Sahara        global $INFO;
34324870174SAndreas Gohr        (new PageRevisions($INFO['id']))->show($first);
344b370ebcdSSatoshi Sahara    }
345f3f0262cSandi}
346f3f0262cSandi
34715fae107Sandi/**
34815fae107Sandi * display recent changes
34915fae107Sandi *
35015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
3515749f1ceSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
35271726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
3538d40b4b6SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
35442ea7f44SGerrit Uitslag *
35542ea7f44SGerrit Uitslag * @param int $first
35642ea7f44SGerrit Uitslag * @param string $show_changes
357bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
35815fae107Sandi */
359d868eb89SAndreas Gohrfunction html_recent($first = 0, $show_changes = 'both')
360d868eb89SAndreas Gohr{
36179a2d784SGerrit Uitslag    dbg_deprecated(Recent::class .'::show()');
36224870174SAndreas Gohr    (new Recent($first, $show_changes))->show();
363f3f0262cSandi}
364f3f0262cSandi
36515fae107Sandi/**
36615fae107Sandi * Display page index
36715fae107Sandi *
36815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
36942ea7f44SGerrit Uitslag *
37042ea7f44SGerrit Uitslag * @param string $ns
371bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
37215fae107Sandi */
373d868eb89SAndreas Gohrfunction html_index($ns)
374d868eb89SAndreas Gohr{
37579a2d784SGerrit Uitslag    dbg_deprecated(Index::class .'::show()');
37624870174SAndreas Gohr    (new Index($ns))->show();
377f3f0262cSandi}
378f3f0262cSandi
379f3f0262cSandi/**
38089b939d7SSatoshi Sahara * Index tree item formatter for html_buildlist()
38115fae107Sandi *
382f3f0262cSandi * User function for html_buildlist()
38315fae107Sandi *
38415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
38542ea7f44SGerrit Uitslag *
38642ea7f44SGerrit Uitslag * @param array $item
38742ea7f44SGerrit Uitslag * @return string
3889c8632b4SSatoshi Sahara * @deprecated 2020-07-18
389f3f0262cSandi */
390d868eb89SAndreas Gohrfunction html_list_index($item)
391d868eb89SAndreas Gohr{
39279a2d784SGerrit Uitslag    dbg_deprecated(Index::class .'::formatListItem()');
39373022918SAndreas Gohr    return (new Index())->formatListItem($item);
394f3f0262cSandi}
395f3f0262cSandi
396f3f0262cSandi/**
39789b939d7SSatoshi Sahara * Index list item formatter for html_buildlist()
398cb70c441Sandi *
399a1dee2b9SAdrian Lang * This user function is used in html_buildlist to build the
400cb70c441Sandi * <li> tags for namespaces when displaying the page index
401cb70c441Sandi * it gives different classes to opened or closed "folders"
402cb70c441Sandi *
403cb70c441Sandi * @author Andreas Gohr <andi@splitbrain.org>
40442ea7f44SGerrit Uitslag *
40542ea7f44SGerrit Uitslag * @param array $item
40642ea7f44SGerrit Uitslag * @return string html
4079c8632b4SSatoshi Sahara * @deprecated 2020-07-18
408cb70c441Sandi */
409d868eb89SAndreas Gohrfunction html_li_index($item)
410d868eb89SAndreas Gohr{
41179a2d784SGerrit Uitslag    dbg_deprecated(Index::class .'::tagListItem()');
41273022918SAndreas Gohr    return (new Index())->tagListItem($item);
413cb70c441Sandi}
414cb70c441Sandi
415cb70c441Sandi/**
41689b939d7SSatoshi Sahara * Default list item formatter for html_buildlist()
41789b939d7SSatoshi Sahara *
41889b939d7SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org>
41989b939d7SSatoshi Sahara *
42089b939d7SSatoshi Sahara * @param array $item
42189b939d7SSatoshi Sahara * @return string html
42289b939d7SSatoshi Sahara * @deprecated 2020-07-18
42389b939d7SSatoshi Sahara */
424d868eb89SAndreas Gohrfunction html_li_default($item)
425d868eb89SAndreas Gohr{
42689b939d7SSatoshi Sahara    return '<li class="level'.$item['level'].'">';
42789b939d7SSatoshi Sahara}
42889b939d7SSatoshi Sahara
42989b939d7SSatoshi Sahara/**
43015fae107Sandi * Build an unordered list
43115fae107Sandi *
432f3f0262cSandi * Build an unordered list from the given $data array
433f3f0262cSandi * Each item in the array has to have a 'level' property
434f3f0262cSandi * the item itself gets printed by the given $func user
435cb70c441Sandi * function. The second and optional function is used to
436cb70c441Sandi * print the <li> tag. Both user function need to accept
437cb70c441Sandi * a single item.
43815fae107Sandi *
439c5a8fd96SAndreas Gohr * Both user functions can be given as array to point to
440c5a8fd96SAndreas Gohr * a member of an object.
441c5a8fd96SAndreas Gohr *
44215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
44380679bafSGerrit Uitslag *
44480679bafSGerrit Uitslag * @param array    $data  array with item arrays
44580679bafSGerrit Uitslag * @param string   $class class of ul wrapper
44680679bafSGerrit Uitslag * @param callable $func  callback to print an list item
447bde560b4SSatoshi Sahara * @param callable $lifunc (optional) callback to the opening li tag
448bde560b4SSatoshi Sahara * @param bool     $forcewrapper (optional) Trigger building a wrapper ul if the first level is
449ae614416SAnika Henke *                               0 (we have a root object) or 1 (just the root content)
45080679bafSGerrit Uitslag * @return string html of an unordered list
451f3f0262cSandi */
452d868eb89SAndreas Gohrfunction html_buildlist($data, $class, $func, $lifunc = null, $forcewrapper = false)
453d868eb89SAndreas Gohr{
45424870174SAndreas Gohr    if ($data === []) {
455a1dee2b9SAdrian Lang        return '';
456a1dee2b9SAdrian Lang    }
457a1dee2b9SAdrian Lang
4582689c55fSMichael Große    $firstElement = reset($data);
4592689c55fSMichael Große    $start_level = $firstElement['level'];
4609e4f7880SAdrian Lang    $level = $start_level;
4619c8632b4SSatoshi Sahara    $html  = '';
462434f5921SHakan Sandell    $open  = 0;
4639e4f7880SAdrian Lang
464bde560b4SSatoshi Sahara    // set callback function to build the <li> tag, formerly defined as html_li_default()
465bde560b4SSatoshi Sahara    if (!is_callable($lifunc)) {
46624870174SAndreas Gohr       $lifunc = static fn($item) => '<li class="level'.$item['level'].'">';
467bde560b4SSatoshi Sahara    }
468bde560b4SSatoshi Sahara
469f3f0262cSandi    foreach ($data as $item) {
470f3f0262cSandi        if ($item['level'] > $level) {
471f3f0262cSandi            //open new list
472df52d0feSandi            for ($i = 0; $i < ($item['level'] - $level); $i++) {
4739c8632b4SSatoshi Sahara                if ($i) $html .= '<li class="clear">';
4749c8632b4SSatoshi Sahara                $html .= "\n".'<ul class="'.$class.'">'."\n";
475434f5921SHakan Sandell                $open++;
476df52d0feSandi            }
477434f5921SHakan Sandell            $level = $item['level'];
478434f5921SHakan Sandell
479f3f0262cSandi        } elseif ($item['level'] < $level) {
480f3f0262cSandi            //close last item
4819c8632b4SSatoshi Sahara            $html .= '</li>'."\n";
482434f5921SHakan Sandell            while ($level > $item['level'] && $open > 0 ) {
483f3f0262cSandi                //close higher lists
4849c8632b4SSatoshi Sahara                $html .= '</ul>'."\n".'</li>'."\n";
485434f5921SHakan Sandell                $level--;
486434f5921SHakan Sandell                $open--;
487f3f0262cSandi            }
4889c8632b4SSatoshi Sahara        } elseif ($html !== '') {
48987671313SHakan Sandell            //close previous item
4909c8632b4SSatoshi Sahara            $html .= '</li>'."\n";
491f3f0262cSandi        }
492f3f0262cSandi
493f3f0262cSandi        //print item
4949c8632b4SSatoshi Sahara        $html .= call_user_func($lifunc, $item);
4959c8632b4SSatoshi Sahara        $html .= '<div class="li">';
49634dbe711Schris
4979c8632b4SSatoshi Sahara        $html .= call_user_func($func, $item);
4989c8632b4SSatoshi Sahara        $html .= '</div>';
499f3f0262cSandi    }
500f3f0262cSandi
501f3f0262cSandi    //close remaining items and lists
5029c8632b4SSatoshi Sahara    $html .= '</li>'."\n";
503434f5921SHakan Sandell    while ($open-- > 0) {
5049c8632b4SSatoshi Sahara        $html .= '</ul></li>'."\n";
505434f5921SHakan Sandell    }
506434f5921SHakan Sandell
507434f5921SHakan Sandell    if ($forcewrapper || $start_level < 2) {
508434f5921SHakan Sandell        // Trigger building a wrapper ul if the first level is
509434f5921SHakan Sandell        // 0 (we have a root object) or 1 (just the root content)
5109c8632b4SSatoshi Sahara        $html = "\n".'<ul class="'.$class.'">'."\n".$html.'</ul>'."\n";
511f3f0262cSandi    }
512f3f0262cSandi
5139c8632b4SSatoshi Sahara    return $html;
514f3f0262cSandi}
515f3f0262cSandi
51615fae107Sandi/**
51715fae107Sandi * display backlinks
51815fae107Sandi *
51915fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
52011df47ecSMichael Klier * @author Michael Klier <chi@chimeric.de>
521bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
52215fae107Sandi */
523d868eb89SAndreas Gohrfunction html_backlinks()
524d868eb89SAndreas Gohr{
52579a2d784SGerrit Uitslag    dbg_deprecated(Backlinks::class .'::show()');
52673022918SAndreas Gohr    (new Backlinks())->show();
52795b451bcSAdrian Lang}
52895b451bcSAdrian Lang
52915fae107Sandi/**
530a215faf2SSatoshi Sahara * Get header of diff HTML
531a215faf2SSatoshi Sahara *
532a215faf2SSatoshi Sahara * @param string $l_rev   Left revisions
533a215faf2SSatoshi Sahara * @param string $r_rev   Right revision
534a215faf2SSatoshi Sahara * @param string $id      Page id, if null $ID is used
535a215faf2SSatoshi Sahara * @param bool   $media   If it is for media files
536a215faf2SSatoshi Sahara * @param bool   $inline  Return the header on a single line
537a215faf2SSatoshi Sahara * @return string[] HTML snippets for diff header
538a215faf2SSatoshi Sahara * @deprecated 2020-07-18
539a215faf2SSatoshi Sahara */
540d868eb89SAndreas Gohrfunction html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = false)
541d868eb89SAndreas Gohr{
54279a2d784SGerrit Uitslag    dbg_deprecated('see '. PageDiff::class .'::buildDiffHead()');
54379a2d784SGerrit Uitslag    return ['', '', '', ''];
544a215faf2SSatoshi Sahara}
545a215faf2SSatoshi Sahara
546a215faf2SSatoshi Sahara/**
54704e99fe1SGerrit Uitslag * Show diff
548baf0c3e5SGerrit Uitslag * between current page version and provided $text
549baf0c3e5SGerrit Uitslag * or between the revisions provided via GET or POST
55015fae107Sandi *
55115fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
552baf0c3e5SGerrit Uitslag * @param  string $text  when non-empty: compare with this text with most current version
55304e99fe1SGerrit Uitslag * @param  bool   $intro display the intro text
5548d5e837eSMichael Hamann * @param  string $type  type of the diff (inline or sidebyside)
555bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
55615fae107Sandi */
557d868eb89SAndreas Gohrfunction html_diff($text = '', $intro = true, $type = null)
558d868eb89SAndreas Gohr{
55979a2d784SGerrit Uitslag    dbg_deprecated(PageDiff::class .'::show()');
560edb50e6aSSatoshi Sahara    global $INFO;
56124870174SAndreas Gohr    (new PageDiff($INFO['id']))->compareWith($text)->preference([
562edb50e6aSSatoshi Sahara        'showIntro' => $intro,
563edb50e6aSSatoshi Sahara        'difftype'  => $type,
564edb50e6aSSatoshi Sahara    ])->show();
565fcfecb69SChristopher Smith}
566fcfecb69SChristopher Smith
56715fae107Sandi/**
568a215faf2SSatoshi Sahara * Create html for revision navigation
569a215faf2SSatoshi Sahara *
570a215faf2SSatoshi Sahara * @param PageChangeLog $pagelog changelog object of current page
571a215faf2SSatoshi Sahara * @param string        $type    inline vs sidebyside
572a215faf2SSatoshi Sahara * @param int           $l_rev   left revision timestamp
573a215faf2SSatoshi Sahara * @param int           $r_rev   right revision timestamp
574a215faf2SSatoshi Sahara * @return string[] html of left and right navigation elements
575a215faf2SSatoshi Sahara * @deprecated 2020-07-18
576a215faf2SSatoshi Sahara */
577d868eb89SAndreas Gohrfunction html_diff_navigation($pagelog, $type, $l_rev, $r_rev)
578d868eb89SAndreas Gohr{
57979a2d784SGerrit Uitslag    dbg_deprecated('see '. PageDiff::class .'::buildRevisionsNavigation()');
58079a2d784SGerrit Uitslag    return ['', ''];
581a215faf2SSatoshi Sahara}
582a215faf2SSatoshi Sahara
583a215faf2SSatoshi Sahara/**
584a215faf2SSatoshi Sahara * Create html link to a diff defined by two revisions
585a215faf2SSatoshi Sahara *
586a215faf2SSatoshi Sahara * @param string $difftype display type
587a215faf2SSatoshi Sahara * @param string $linktype
588a215faf2SSatoshi Sahara * @param int $lrev oldest revision
589a215faf2SSatoshi Sahara * @param int $rrev newest revision or null for diff with current revision
590a215faf2SSatoshi Sahara * @return string html of link to a diff
591a215faf2SSatoshi Sahara * @deprecated 2020-07-18
592a215faf2SSatoshi Sahara */
593d868eb89SAndreas Gohrfunction html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null)
594d868eb89SAndreas Gohr{
59579a2d784SGerrit Uitslag    dbg_deprecated('see '. PageDiff::class .'::diffViewlink()');
59679a2d784SGerrit Uitslag    return '';
597a215faf2SSatoshi Sahara}
598a215faf2SSatoshi Sahara
599a215faf2SSatoshi Sahara/**
600a215faf2SSatoshi Sahara * Insert soft breaks in diff html
601a215faf2SSatoshi Sahara *
602a215faf2SSatoshi Sahara * @param string $diffhtml
603a215faf2SSatoshi Sahara * @return string
604a215faf2SSatoshi Sahara * @deprecated 2020-07-18
605a215faf2SSatoshi Sahara */
606d868eb89SAndreas Gohrfunction html_insert_softbreaks($diffhtml)
607d868eb89SAndreas Gohr{
60879a2d784SGerrit Uitslag    dbg_deprecated(PageDiff::class .'::insertSoftbreaks()');
60973022918SAndreas Gohr    return (new PageDiff())->insertSoftbreaks($diffhtml);
610a215faf2SSatoshi Sahara}
611a215faf2SSatoshi Sahara
612a215faf2SSatoshi Sahara/**
61315fae107Sandi * show warning on conflict detection
61415fae107Sandi *
61515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
61642ea7f44SGerrit Uitslag *
61742ea7f44SGerrit Uitslag * @param string $text
61842ea7f44SGerrit Uitslag * @param string $summary
619bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
62015fae107Sandi */
621d868eb89SAndreas Gohrfunction html_conflict($text, $summary)
622d868eb89SAndreas Gohr{
62379a2d784SGerrit Uitslag    dbg_deprecated(PageConflict::class .'::show()');
62424870174SAndreas Gohr    (new PageConflict($text, $summary))->show();
625f3f0262cSandi}
626f3f0262cSandi
627f3f0262cSandi/**
62815fae107Sandi * Prints the global message array
62915fae107Sandi *
63015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
631f3f0262cSandi */
632d868eb89SAndreas Gohrfunction html_msgarea()
633d868eb89SAndreas Gohr{
634cc58224cSMichael Hamann    global $MSG, $MSG_shown;
6358d5e837eSMichael Hamann    /** @var array $MSG */
636cc58224cSMichael Hamann    // store if the global $MSG has already been shown and thus HTML output has been started
637cc58224cSMichael Hamann    $MSG_shown = true;
638cc58224cSMichael Hamann
639f3f0262cSandi    if (!isset($MSG)) return;
640f3f0262cSandi
64124870174SAndreas Gohr    $shown = [];
642f3f0262cSandi    foreach ($MSG as $msg) {
6434af9f0d4SAndreas Gohr        $hash = md5($msg['msg']);
6444af9f0d4SAndreas Gohr        if (isset($shown[$hash])) continue; // skip double messages
645f755f9abSChristopher Smith        if (info_msg_allowed($msg)) {
646f3f0262cSandi            print '<div class="'.$msg['lvl'].'">';
647f3f0262cSandi            print $msg['msg'];
648f3f0262cSandi            print '</div>';
649d3bae478SChristopher Smith        }
6504af9f0d4SAndreas Gohr        $shown[$hash] = 1;
651f3f0262cSandi    }
652cc58224cSMichael Hamann
653cc58224cSMichael Hamann    unset($GLOBALS['MSG']);
654f3f0262cSandi}
655f3f0262cSandi
656f3f0262cSandi/**
657f3f0262cSandi * Prints the registration form
65815fae107Sandi *
65915fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
660bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
661f3f0262cSandi */
662d868eb89SAndreas Gohrfunction html_register()
663d868eb89SAndreas Gohr{
66479a2d784SGerrit Uitslag    dbg_deprecated(UserRegister::class .'::show()');
66573022918SAndreas Gohr    (new UserRegister())->show();
666f3f0262cSandi}
667f3f0262cSandi
668f3f0262cSandi/**
6698b06d178Schris * Print the update profile form
6708b06d178Schris *
6718b06d178Schris * @author Christopher Smith <chris@jalakai.co.uk>
6728b06d178Schris * @author Andreas Gohr <andi@splitbrain.org>
673bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
6748b06d178Schris */
675d868eb89SAndreas Gohrfunction html_updateprofile()
676d868eb89SAndreas Gohr{
67779a2d784SGerrit Uitslag    dbg_deprecated(UserProfile::class .'::show()');
67873022918SAndreas Gohr    (new UserProfile())->show();
6798b06d178Schris}
6808b06d178Schris
6818b06d178Schris/**
6827c4635c4SAdrian Lang * Preprocess edit form data
68315fae107Sandi *
68415fae107Sandi * @author   Andreas Gohr <andi@splitbrain.org>
6852ffea8f2SAdrian Lang *
686bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
687f3f0262cSandi */
688d868eb89SAndreas Gohrfunction html_edit()
689d868eb89SAndreas Gohr{
69079a2d784SGerrit Uitslag    dbg_deprecated(Editor::class .'::show()');
69173022918SAndreas Gohr    (new Editor())->show();
692b6912aeaSAndreas Gohr}
693b6912aeaSAndreas Gohr
694b6912aeaSAndreas Gohr/**
695bf69f8cbSSatoshi Sahara * Display the default edit form
696bf69f8cbSSatoshi Sahara *
697bf69f8cbSSatoshi Sahara * Is the default action for HTML_EDIT_FORMSELECTION.
698bf69f8cbSSatoshi Sahara *
69979a2d784SGerrit Uitslag * @param array $param
700bf69f8cbSSatoshi Sahara * @deprecated 2020-07-18
701bf69f8cbSSatoshi Sahara */
702d868eb89SAndreas Gohrfunction html_edit_form($param)
703d868eb89SAndreas Gohr{
70479a2d784SGerrit Uitslag    dbg_deprecated(Editor::class .'::addTextarea()');
70573022918SAndreas Gohr    (new Editor())->addTextarea($param);
706bf69f8cbSSatoshi Sahara}
707bf69f8cbSSatoshi Sahara
708bf69f8cbSSatoshi Sahara/**
709f3f0262cSandi * prints some debug info
71015fae107Sandi *
71115fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
712f3f0262cSandi */
713d868eb89SAndreas Gohrfunction html_debug()
714d868eb89SAndreas Gohr{
715f3f0262cSandi    global $conf;
716d16a4edaSandi    global $lang;
717e1d9dcc8SAndreas Gohr    /** @var AuthPlugin $auth */
7185298a619SAndreas Gohr    global $auth;
719100a97e3SAndreas Gohr    global $INFO;
720100a97e3SAndreas Gohr
72128fb55ffSandi    //remove sensitive data
72228fb55ffSandi    $cnf = $conf;
72324297a69SAndreas Gohr    debug_guard($cnf);
724100a97e3SAndreas Gohr    $nfo = $INFO;
72524297a69SAndreas Gohr    debug_guard($nfo);
726100a97e3SAndreas Gohr    $ses = $_SESSION;
72724297a69SAndreas Gohr    debug_guard($ses);
728f3f0262cSandi
729f3f0262cSandi    print '<html><body>';
730f3f0262cSandi
731f3f0262cSandi    print '<p>When reporting bugs please send all the following ';
732f3f0262cSandi    print 'output as a mail to andi@splitbrain.org ';
733f3f0262cSandi    print 'The best way to do this is to save this page in your browser</p>';
734f3f0262cSandi
735100a97e3SAndreas Gohr    print '<b>$INFO:</b><pre>';
736100a97e3SAndreas Gohr    print_r($nfo);
737100a97e3SAndreas Gohr    print '</pre>';
738100a97e3SAndreas Gohr
739f3f0262cSandi    print '<b>$_SERVER:</b><pre>';
740f3f0262cSandi    print_r($_SERVER);
741f3f0262cSandi    print '</pre>';
742f3f0262cSandi
743f3f0262cSandi    print '<b>$conf:</b><pre>';
74428fb55ffSandi    print_r($cnf);
745f3f0262cSandi    print '</pre>';
746f3f0262cSandi
747ed7b5f09Sandi    print '<b>DOKU_BASE:</b><pre>';
748ed7b5f09Sandi    print DOKU_BASE;
749f3f0262cSandi    print '</pre>';
750f3f0262cSandi
751ed7b5f09Sandi    print '<b>abs DOKU_BASE:</b><pre>';
752ed7b5f09Sandi    print DOKU_URL;
753ed7b5f09Sandi    print '</pre>';
754ed7b5f09Sandi
755ed7b5f09Sandi    print '<b>rel DOKU_BASE:</b><pre>';
756f3f0262cSandi    print dirname($_SERVER['PHP_SELF']).'/';
757f3f0262cSandi    print '</pre>';
758f3f0262cSandi
759f3f0262cSandi    print '<b>PHP Version:</b><pre>';
760f3f0262cSandi    print phpversion();
761f3f0262cSandi    print '</pre>';
762f3f0262cSandi
763f3f0262cSandi    print '<b>locale:</b><pre>';
764f3f0262cSandi    print setlocale(LC_ALL, 0);
765f3f0262cSandi    print '</pre>';
766f3f0262cSandi
767d16a4edaSandi    print '<b>encoding:</b><pre>';
768d16a4edaSandi    print $lang['encoding'];
769d16a4edaSandi    print '</pre>';
770d16a4edaSandi
7715298a619SAndreas Gohr    if ($auth) {
7725298a619SAndreas Gohr        print '<b>Auth backend capabilities:</b><pre>';
7732f46ade0SChristopher Smith        foreach ($auth->getCapabilities() as $cando) {
7747afe5d93SSatoshi Sahara            print '   '.str_pad($cando, 16) .' => '. (int)$auth->canDo($cando) . DOKU_LF;
7752f46ade0SChristopher Smith        }
7765298a619SAndreas Gohr        print '</pre>';
7775298a619SAndreas Gohr    }
7785298a619SAndreas Gohr
7793aa54d7cSAndreas Gohr    print '<b>$_SESSION:</b><pre>';
780100a97e3SAndreas Gohr    print_r($ses);
7813aa54d7cSAndreas Gohr    print '</pre>';
7823aa54d7cSAndreas Gohr
783f3f0262cSandi    print '<b>Environment:</b><pre>';
784f3f0262cSandi    print_r($_ENV);
785f3f0262cSandi    print '</pre>';
786f3f0262cSandi
787f3f0262cSandi    print '<b>PHP settings:</b><pre>';
788f3f0262cSandi    $inis = ini_get_all();
789f3f0262cSandi    print_r($inis);
790f3f0262cSandi    print '</pre>';
791f3f0262cSandi
792e89b7c1eSChristopher Smith    if (function_exists('apache_get_version')) {
79324870174SAndreas Gohr        $apache = [];
794e89b7c1eSChristopher Smith        $apache['version'] = apache_get_version();
795e89b7c1eSChristopher Smith
796e89b7c1eSChristopher Smith        if (function_exists('apache_get_modules')) {
797e89b7c1eSChristopher Smith            $apache['modules'] = apache_get_modules();
798e89b7c1eSChristopher Smith        }
799e89b7c1eSChristopher Smith        print '<b>Apache</b><pre>';
800e89b7c1eSChristopher Smith        print_r($apache);
801e89b7c1eSChristopher Smith        print '</pre>';
802e89b7c1eSChristopher Smith    }
803e89b7c1eSChristopher Smith
804f3f0262cSandi    print '</body></html>';
805f3f0262cSandi}
806f3f0262cSandi
80710271ce4SAndreas Gohr/**
8088b06d178Schris * Form to request a new password for an existing account
8098b06d178Schris *
8108b06d178Schris * @author Benoit Chesneau <benoit@bchesneau.info>
811cc204bbdSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de>
812bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
81311e2ce22Schris */
814d868eb89SAndreas Gohrfunction html_resendpwd()
815d868eb89SAndreas Gohr{
81679a2d784SGerrit Uitslag    dbg_deprecated(UserResendPwd::class .'::show()');
81773022918SAndreas Gohr    (new UserResendPwd())->show();
818cc204bbdSAndreas Gohr}
819cc204bbdSAndreas Gohr
820fdb8d77bSTom N Harris/**
821b8595a66SAndreas Gohr * Return the TOC rendered to XHTML
822b8595a66SAndreas Gohr *
823b8595a66SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
82442ea7f44SGerrit Uitslag *
82542ea7f44SGerrit Uitslag * @param array $toc
82642ea7f44SGerrit Uitslag * @return string html
827b8595a66SAndreas Gohr */
828d868eb89SAndreas Gohrfunction html_TOC($toc)
829d868eb89SAndreas Gohr{
83024870174SAndreas Gohr    if ($toc === []) return '';
831b8595a66SAndreas Gohr    global $lang;
832b8595a66SAndreas Gohr    $out  = '<!-- TOC START -->'.DOKU_LF;
833158a5bffSDeathCamel57    $out .= '<div id="dw__toc" class="dw__toc">'.DOKU_LF;
83448722ac8SAnika Henke    $out .= '<h3 class="toggle">';
835b8595a66SAndreas Gohr    $out .= $lang['toc'];
836d5acc30dSAnika Henke    $out .= '</h3>'.DOKU_LF;
837d5acc30dSAnika Henke    $out .= '<div>'.DOKU_LF;
838bde560b4SSatoshi Sahara    $out .= html_buildlist($toc, 'toc', 'html_list_toc', null, true);
839b8595a66SAndreas Gohr    $out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF;
840b8595a66SAndreas Gohr    $out .= '<!-- TOC END -->'.DOKU_LF;
841db959ae3SAndreas Gohr    return $out;
842db959ae3SAndreas Gohr}
843b8595a66SAndreas Gohr
844b8595a66SAndreas Gohr/**
845b8595a66SAndreas Gohr * Callback for html_buildlist
84642ea7f44SGerrit Uitslag *
84742ea7f44SGerrit Uitslag * @param array $item
84842ea7f44SGerrit Uitslag * @return string html
849b8595a66SAndreas Gohr */
850d868eb89SAndreas Gohrfunction html_list_toc($item)
851d868eb89SAndreas Gohr{
852c66972f2SAdrian Lang    if (isset($item['hid'])){
8537d91652aSAndreas Gohr        $link = '#'.$item['hid'];
8547d91652aSAndreas Gohr    } else {
8557d91652aSAndreas Gohr        $link = $item['link'];
8567d91652aSAndreas Gohr    }
8577d91652aSAndreas Gohr
858d5acc30dSAnika Henke    return '<a href="'.$link.'">'.hsc($item['title']).'</a>';
859b8595a66SAndreas Gohr}
860b8595a66SAndreas Gohr
861b8595a66SAndreas Gohr/**
862b8595a66SAndreas Gohr * Helper function to build TOC items
863b8595a66SAndreas Gohr *
864b8595a66SAndreas Gohr * Returns an array ready to be added to a TOC array
865b8595a66SAndreas Gohr *
866b8595a66SAndreas Gohr * @param string $link  - where to link (if $hash set to '#' it's a local anchor)
867b8595a66SAndreas Gohr * @param string $text  - what to display in the TOC
868b8595a66SAndreas Gohr * @param int    $level - nesting level
869b8595a66SAndreas Gohr * @param string $hash  - is prepended to the given $link, set blank if you want full links
8708d5e837eSMichael Hamann * @return array the toc item
871b8595a66SAndreas Gohr */
872d868eb89SAndreas Gohrfunction html_mktocitem($link, $text, $level, $hash = '#')
873d868eb89SAndreas Gohr{
87424870174SAndreas Gohr    return  [
875bde560b4SSatoshi Sahara        'link'  => $hash.$link,
876b8595a66SAndreas Gohr        'title' => $text,
877b8595a66SAndreas Gohr        'type'  => 'ul',
878bde560b4SSatoshi Sahara        'level' => $level
87924870174SAndreas Gohr    ];
880b8595a66SAndreas Gohr}
881b8595a66SAndreas Gohr
882b8595a66SAndreas Gohr/**
883fdb8d77bSTom N Harris * Output a Doku_Form object.
884fdb8d77bSTom N Harris * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT
885fdb8d77bSTom N Harris *
886fdb8d77bSTom N Harris * @author Tom N Harris <tnharris@whoopdedo.org>
88742ea7f44SGerrit Uitslag *
8888d5e837eSMichael Hamann * @param string     $name The name of the form
8898d5e837eSMichael Hamann * @param Doku_Form  $form The form
8902162df3aSSatoshi Sahara * @return void
8912162df3aSSatoshi Sahara * @deprecated 2020-07-18
892fdb8d77bSTom N Harris */
893d868eb89SAndreas Gohrfunction html_form($name, $form)
894d868eb89SAndreas Gohr{
8958a5f08afSSatoshi Sahara    dbg_deprecated('use dokuwiki\Form\Form instead of Doku_Form');
896fdb8d77bSTom N Harris    // Safety check in case the caller forgets.
897fdb8d77bSTom N Harris    $form->endFieldset();
898cbb44eabSAndreas Gohr    Event::createAndTrigger('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false);
899fdb8d77bSTom N Harris}
900fdb8d77bSTom N Harris
901fdb8d77bSTom N Harris/**
902fdb8d77bSTom N Harris * Form print function.
903c29600d0SSatoshi Sahara * Just calls printForm() on the form object.
90442ea7f44SGerrit Uitslag *
905c29600d0SSatoshi Sahara * @param Doku_Form $form The form
9062162df3aSSatoshi Sahara * @return void
9072162df3aSSatoshi Sahara * @deprecated 2020-07-18
908fdb8d77bSTom N Harris */
909d868eb89SAndreas Gohrfunction html_form_output($form)
910d868eb89SAndreas Gohr{
91124870174SAndreas Gohr    dbg_deprecated('use ' . Form::class . '::toHTML()');
91225dd2a2fSSatoshi Sahara    $form->printForm();
91325dd2a2fSSatoshi Sahara}
914340756e4Sandi
91507bf32b2SAndreas Gohr/**
91607bf32b2SAndreas Gohr * Embed a flash object in HTML
91707bf32b2SAndreas Gohr *
91807bf32b2SAndreas Gohr * This will create the needed HTML to embed a flash movie in a cross browser
91907bf32b2SAndreas Gohr * compatble way using valid XHTML
92007bf32b2SAndreas Gohr *
92107bf32b2SAndreas Gohr * The parameters $params, $flashvars and $atts need to be associative arrays.
92207bf32b2SAndreas Gohr * No escaping needs to be done for them. The alternative content *has* to be
92307bf32b2SAndreas Gohr * escaped because it is used as is. If no alternative content is given
92407bf32b2SAndreas Gohr * $lang['noflash'] is used.
92507bf32b2SAndreas Gohr *
92607bf32b2SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
92707bf32b2SAndreas Gohr * @link   http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml
92807bf32b2SAndreas Gohr *
92907bf32b2SAndreas Gohr * @param string $swf      - the SWF movie to embed
93007bf32b2SAndreas Gohr * @param int $width       - width of the flash movie in pixels
93107bf32b2SAndreas Gohr * @param int $height      - height of the flash movie in pixels
93207bf32b2SAndreas Gohr * @param array $params    - additional parameters (<param>)
93307bf32b2SAndreas Gohr * @param array $flashvars - parameters to be passed in the flashvar parameter
93407bf32b2SAndreas Gohr * @param array $atts      - additional attributes for the <object> tag
93507bf32b2SAndreas Gohr * @param string $alt      - alternative content (is NOT automatically escaped!)
936b3d1090eSMichael Hamann * @return string         - the XHTML markup
93707bf32b2SAndreas Gohr */
938d868eb89SAndreas Gohrfunction html_flashobject($swf, $width, $height, $params = null, $flashvars = null, $atts = null, $alt = '')
939d868eb89SAndreas Gohr{
94007bf32b2SAndreas Gohr    global $lang;
94107bf32b2SAndreas Gohr
94207bf32b2SAndreas Gohr    $out = '';
94307bf32b2SAndreas Gohr
94407bf32b2SAndreas Gohr    // prepare the object attributes
94524870174SAndreas Gohr    if(is_null($atts)) $atts = [];
94607bf32b2SAndreas Gohr    $atts['width']  = (int) $width;
947d4c61e61SAndreas Gohr    $atts['height'] = (int) $height;
94807bf32b2SAndreas Gohr    if(!$atts['width'])  $atts['width']  = 425;
94907bf32b2SAndreas Gohr    if(!$atts['height']) $atts['height'] = 350;
95007bf32b2SAndreas Gohr
95107bf32b2SAndreas Gohr    // add object attributes for standard compliant browsers
95207bf32b2SAndreas Gohr    $std = $atts;
95307bf32b2SAndreas Gohr    $std['type'] = 'application/x-shockwave-flash';
95407bf32b2SAndreas Gohr    $std['data'] = $swf;
95507bf32b2SAndreas Gohr
95607bf32b2SAndreas Gohr    // add object attributes for IE
95707bf32b2SAndreas Gohr    $ie  = $atts;
95807bf32b2SAndreas Gohr    $ie['classid'] = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
95907bf32b2SAndreas Gohr
96007bf32b2SAndreas Gohr    // open object (with conditional comments)
96107bf32b2SAndreas Gohr    $out .= '<!--[if !IE]> -->'.NL;
96207bf32b2SAndreas Gohr    $out .= '<object '.buildAttributes($std).'>'.NL;
96307bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->'.NL;
96407bf32b2SAndreas Gohr    $out .= '<!--[if IE]>'.NL;
96507bf32b2SAndreas Gohr    $out .= '<object '.buildAttributes($ie).'>'.NL;
96607bf32b2SAndreas Gohr    $out .= '    <param name="movie" value="'.hsc($swf).'" />'.NL;
9679ae41cdcSAndreas Gohr    $out .= '<!--><!-- -->'.NL;
96807bf32b2SAndreas Gohr
96907bf32b2SAndreas Gohr    // print params
97007bf32b2SAndreas Gohr    if(is_array($params)) foreach($params as $key => $val){
97107bf32b2SAndreas Gohr        $out .= '  <param name="'.hsc($key).'" value="'.hsc($val).'" />'.NL;
97207bf32b2SAndreas Gohr    }
97307bf32b2SAndreas Gohr
97407bf32b2SAndreas Gohr    // add flashvars
97507bf32b2SAndreas Gohr    if(is_array($flashvars)){
976d4c61e61SAndreas Gohr        $out .= '  <param name="FlashVars" value="'.buildURLparams($flashvars).'" />'.NL;
97707bf32b2SAndreas Gohr    }
97807bf32b2SAndreas Gohr
97907bf32b2SAndreas Gohr    // alternative content
98007bf32b2SAndreas Gohr    if($alt){
98107bf32b2SAndreas Gohr        $out .= $alt.NL;
98207bf32b2SAndreas Gohr    }else{
98307bf32b2SAndreas Gohr        $out .= $lang['noflash'].NL;
98407bf32b2SAndreas Gohr    }
98507bf32b2SAndreas Gohr
98607bf32b2SAndreas Gohr    // finish
98707bf32b2SAndreas Gohr    $out .= '</object>'.NL;
98807bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->'.NL;
98907bf32b2SAndreas Gohr
99007bf32b2SAndreas Gohr    return $out;
99107bf32b2SAndreas Gohr}
99207bf32b2SAndreas Gohr
9938d5e837eSMichael Hamann/**
9948d5e837eSMichael Hamann * Prints HTML code for the given tab structure
9958d5e837eSMichael Hamann *
9968d5e837eSMichael Hamann * @param array  $tabs        tab structure
9978d5e837eSMichael Hamann * @param string $current_tab the current tab id
9982162df3aSSatoshi Sahara * @return void
9998d5e837eSMichael Hamann */
1000d868eb89SAndreas Gohrfunction html_tabs($tabs, $current_tab = null)
1001d868eb89SAndreas Gohr{
100294add303SAnika Henke    echo '<ul class="tabs">'.NL;
100395b451bcSAdrian Lang
100495b451bcSAdrian Lang    foreach ($tabs as $id => $tab) {
100595b451bcSAdrian Lang        html_tab($tab['href'], $tab['caption'], $id === $current_tab);
100695b451bcSAdrian Lang    }
100795b451bcSAdrian Lang
100894add303SAnika Henke    echo '</ul>'.NL;
100995b451bcSAdrian Lang}
1010cd2a4cfdSAnika Henke
101195b451bcSAdrian Lang/**
101295b451bcSAdrian Lang * Prints a single tab
101395b451bcSAdrian Lang *
101495b451bcSAdrian Lang * @author Kate Arzamastseva <pshns@ukr.net>
101595b451bcSAdrian Lang * @author Adrian Lang <mail@adrianlang.de>
101695b451bcSAdrian Lang *
101795b451bcSAdrian Lang * @param string $href - tab href
101895b451bcSAdrian Lang * @param string $caption - tab caption
101995b451bcSAdrian Lang * @param boolean $selected - is tab selected
10202162df3aSSatoshi Sahara * @return void
102195b451bcSAdrian Lang */
102295b451bcSAdrian Lang
1023d868eb89SAndreas Gohrfunction html_tab($href, $caption, $selected = false)
1024d868eb89SAndreas Gohr{
102595b451bcSAdrian Lang    $tab = '<li>';
102695b451bcSAdrian Lang    if ($selected) {
102795b451bcSAdrian Lang        $tab .= '<strong>';
102895b451bcSAdrian Lang    } else {
102995b451bcSAdrian Lang        $tab .= '<a href="' . hsc($href) . '">';
103095b451bcSAdrian Lang    }
103195b451bcSAdrian Lang    $tab .= hsc($caption)
103295b451bcSAdrian Lang         .  '</' . ($selected ? 'strong' : 'a') . '>'
103394add303SAnika Henke         .  '</li>'.NL;
103495b451bcSAdrian Lang    echo $tab;
103595b451bcSAdrian Lang}
103695b451bcSAdrian Lang
1037cd2a4cfdSAnika Henke/**
1038cd2a4cfdSAnika Henke * Display size change
1039cd2a4cfdSAnika Henke *
1040cd2a4cfdSAnika Henke * @param int $sizechange - size of change in Bytes
1041e34d6962SSatoshi Sahara * @param Doku_Form $form - (optional) form to add elements to
1042e34d6962SSatoshi Sahara * @return void|string
1043cd2a4cfdSAnika Henke */
1044d868eb89SAndreas Gohrfunction html_sizechange($sizechange, $form = null)
1045d868eb89SAndreas Gohr{
1046cd2a4cfdSAnika Henke    if (isset($sizechange)) {
1047cd2a4cfdSAnika Henke        $class = 'sizechange';
1048cd2a4cfdSAnika Henke        $value = filesize_h(abs($sizechange));
1049cd2a4cfdSAnika Henke        if ($sizechange > 0) {
1050cd2a4cfdSAnika Henke            $class .= ' positive';
1051cd2a4cfdSAnika Henke            $value = '+' . $value;
1052cd2a4cfdSAnika Henke        } elseif ($sizechange < 0) {
1053cd2a4cfdSAnika Henke            $class .= ' negative';
1054cd2a4cfdSAnika Henke            $value = '-' . $value;
10550b78a6edSAnika Henke        } else {
10560b78a6edSAnika Henke            $value = '±' . $value;
1057cd2a4cfdSAnika Henke        }
1058e34d6962SSatoshi Sahara        if (!isset($form)) {
1059e34d6962SSatoshi Sahara            return '<span class="'.$class.'">'.$value.'</span>';
1060b0f23f4eSSatoshi Sahara        } else { // Doku_Form
106124870174SAndreas Gohr            $form->addElement(form_makeOpenTag('span', ['class' => $class]));
1062cd2a4cfdSAnika Henke            $form->addElement($value);
1063cd2a4cfdSAnika Henke            $form->addElement(form_makeCloseTag('span'));
1064cd2a4cfdSAnika Henke        }
1065cd2a4cfdSAnika Henke    }
1066b0f23f4eSSatoshi Sahara}
1067