xref: /dokuwiki/inc/html.php (revision b370ebcdb8c1cf2da028da6a07616e3701bfbd40)
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 */
815fae107Sandi
90c3a5702SAndreas Gohruse dokuwiki\ChangeLog\MediaChangeLog;
100c3a5702SAndreas Gohruse dokuwiki\ChangeLog\PageChangeLog;
11e1d9dcc8SAndreas Gohruse dokuwiki\Extension\AuthPlugin;
12cbb44eabSAndreas Gohruse dokuwiki\Extension\Event;
130c3a5702SAndreas Gohr
142d3b082eSMichael Großeif (!defined('SEC_EDIT_PATTERN')) {
1537c80e0eSLarsDW223    define('SEC_EDIT_PATTERN', '#<!-- EDIT({.*?}) -->#');
162d3b082eSMichael Große}
172d3b082eSMichael Große
186bbae538Sandi
19f3f0262cSandi/**
20f3f0262cSandi * Convenience function to quickly build a wikilink
2115fae107Sandi *
2215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
238d5e837eSMichael Hamann * @param string  $id      id of the target page
248d5e837eSMichael Hamann * @param string  $name    the name of the link, i.e. the text that is displayed
258d5e837eSMichael Hamann * @param string|array  $search  search string(s) that shall be highlighted in the target page
268d5e837eSMichael Hamann * @return string the HTML code of the link
27f3f0262cSandi */
28db959ae3SAndreas Gohrfunction html_wikilink($id, $name = null, $search = '') {
29a8397511SGerrit Uitslag    /** @var Doku_Renderer_xhtml $xhtml_renderer */
30db959ae3SAndreas Gohr    static $xhtml_renderer = null;
31723d78dbSandi    if (is_null($xhtml_renderer)) {
327aea91afSChris Smith        $xhtml_renderer = p_get_renderer('xhtml');
33f3f0262cSandi    }
34f3f0262cSandi
35fe9ec250SChris Smith    return $xhtml_renderer->internallink($id,$name,$search,true,'navigation');
36f3f0262cSandi}
37f3f0262cSandi
38f3f0262cSandi/**
39f3f0262cSandi * The loginform
4015fae107Sandi *
4115fae107Sandi * @author   Andreas Gohr <andi@splitbrain.org>
42d1d904bbSMichael Große *
43d1d904bbSMichael Große * @param bool $svg Whether to show svg icons in the register and resendpwd links or not
44bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
45f3f0262cSandi */
46d1d904bbSMichael Großefunction html_login($svg = false) {
4787f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Login::class .'::show()');
48bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Login($svg))->show();
49f3f0262cSandi}
50f3f0262cSandi
51d59dea9fSGerrit Uitslag
52d59dea9fSGerrit Uitslag/**
53d59dea9fSGerrit Uitslag * Denied page content
54d59dea9fSGerrit Uitslag *
55d59dea9fSGerrit Uitslag * @return string html
567afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Denied::tplContent()
57d59dea9fSGerrit Uitslag */
58d59dea9fSGerrit Uitslagfunction html_denied() {
59a215faf2SSatoshi Sahara    dbg_deprecated(\dokuwiki\Action\Denied::class .'::showBanner()');
60a215faf2SSatoshi Sahara    (new dokuwiki\Action\Denied())->showBanner();
61d59dea9fSGerrit Uitslag}
62d59dea9fSGerrit Uitslag
63f3f0262cSandi/**
6415fae107Sandi * inserts section edit buttons if wanted or removes the markers
6515fae107Sandi *
6615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
6742ea7f44SGerrit Uitslag *
6842ea7f44SGerrit Uitslag * @param string $text
6942ea7f44SGerrit Uitslag * @param bool   $show show section edit buttons?
7042ea7f44SGerrit Uitslag * @return string
7115fae107Sandi */
72f3f0262cSandifunction html_secedit($text, $show = true) {
73f3f0262cSandi    global $INFO;
7435dae8b0SBen Coburn
75aac83cd4SPhy    if ((isset($INFO) && !$INFO['writable']) || !$show || (isset($INFO) && $INFO['rev'])) {
762d3b082eSMichael Große        return preg_replace(SEC_EDIT_PATTERN,'',$text);
77f3f0262cSandi    }
7835dae8b0SBen Coburn
792d3b082eSMichael Große    return preg_replace_callback(SEC_EDIT_PATTERN,
8040868f2fSAdrian Lang                'html_secedit_button', $text);
8140868f2fSAdrian Lang}
8240868f2fSAdrian Lang
8340868f2fSAdrian Lang/**
8440868f2fSAdrian Lang * prepares section edit button data for event triggering
8540868f2fSAdrian Lang * used as a callback in html_secedit
8640868f2fSAdrian Lang *
8740868f2fSAdrian Lang * @author Andreas Gohr <andi@splitbrain.org>
8842ea7f44SGerrit Uitslag *
8942ea7f44SGerrit Uitslag * @param array $matches matches with regexp
9042ea7f44SGerrit Uitslag * @return string
9142ea7f44SGerrit Uitslag * @triggers HTML_SECEDIT_BUTTON
9240868f2fSAdrian Lang */
9340868f2fSAdrian Langfunction html_secedit_button($matches){
94ada0d779SMichael Hamann    $json = htmlspecialchars_decode($matches[1], ENT_QUOTES);
95ada0d779SMichael Hamann    $data = json_decode($json, true);
96ec57f119SLarsDW223    if ($data == NULL) {
97ec57f119SLarsDW223        return;
9806917fceSMichael Große    }
99ec57f119SLarsDW223    $data ['target'] = strtolower($data['target']);
100ec57f119SLarsDW223    $data ['hid'] = strtolower($data['hid']);
10140868f2fSAdrian Lang
102cbb44eabSAndreas Gohr    return Event::createAndTrigger('HTML_SECEDIT_BUTTON', $data,
10340868f2fSAdrian Lang                         'html_secedit_get_button');
10440868f2fSAdrian Lang}
10540868f2fSAdrian Lang
10640868f2fSAdrian Lang/**
10740868f2fSAdrian Lang * prints a section editing button
10840868f2fSAdrian Lang * used as default action form HTML_SECEDIT_BUTTON
10940868f2fSAdrian Lang *
11040868f2fSAdrian Lang * @author Adrian Lang <lang@cosmocode.de>
11142ea7f44SGerrit Uitslag *
11242ea7f44SGerrit Uitslag * @param array $data name, section id and target
11342ea7f44SGerrit Uitslag * @return string html
11440868f2fSAdrian Lang */
11540868f2fSAdrian Langfunction html_secedit_get_button($data) {
11640868f2fSAdrian Lang    global $ID;
11740868f2fSAdrian Lang    global $INFO;
11840868f2fSAdrian Lang
1196d9eab4dSMichael Hamann    if (!isset($data['name']) || $data['name'] === '') return '';
12040868f2fSAdrian Lang
12140868f2fSAdrian Lang    $name = $data['name'];
12240868f2fSAdrian Lang    unset($data['name']);
12340868f2fSAdrian Lang
124905fa971SAdrian Lang    $secid = $data['secid'];
125905fa971SAdrian Lang    unset($data['secid']);
126905fa971SAdrian Lang
1277afe5d93SSatoshi Sahara    $params = array_merge(
1287afe5d93SSatoshi Sahara           array('do'  => 'edit', 'rev' => $INFO['lastmod'], 'summary' => '['.$name.'] '),
1297afe5d93SSatoshi Sahara           $data
1307afe5d93SSatoshi Sahara    );
1317afe5d93SSatoshi Sahara
1327afe5d93SSatoshi Sahara    $html = '<div class="secedit editbutton_'.$data['target'] .' editbutton_'.$secid .'">';
1337afe5d93SSatoshi Sahara    $html.= html_btn('secedit', $ID, '', $params, 'post', $name);
1347afe5d93SSatoshi Sahara    $html.= '</div>';
1357afe5d93SSatoshi Sahara    return $html;
136f3f0262cSandi}
137f3f0262cSandi
138f3f0262cSandi/**
139d6c9c552Smatthiasgrimm * Just the back to top button (in its own form)
1406b13307fSandi *
1416b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
14242ea7f44SGerrit Uitslag *
14342ea7f44SGerrit Uitslag * @return string html
1446b13307fSandi */
1456b13307fSandifunction html_topbtn() {
1466b13307fSandi    global $lang;
1476b13307fSandi
1487afe5d93SSatoshi Sahara    $html = '<a class="nolink" href="#dokuwiki__top">'
1497afe5d93SSatoshi Sahara        .'<button class="button" onclick="window.scrollTo(0, 0)" title="'. $lang['btn_top'] .'">'
1507afe5d93SSatoshi Sahara        . $lang['btn_top']
1517afe5d93SSatoshi Sahara        .'</button></a>';
1527afe5d93SSatoshi Sahara    return $html;
1536b13307fSandi}
1546b13307fSandi
1556b13307fSandi/**
156d67ca2c0Smatthiasgrimm * Displays a button (using its own form)
15735dae8b0SBen Coburn * If tooltip exists, the access key tooltip is replaced.
15815fae107Sandi *
15915fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
16042ea7f44SGerrit Uitslag *
16142ea7f44SGerrit Uitslag * @param string         $name
16242ea7f44SGerrit Uitslag * @param string         $id
16342ea7f44SGerrit Uitslag * @param string         $akey   access key
164e3710957SGerrit Uitslag * @param string[] $params key-value pairs added as hidden inputs
16542ea7f44SGerrit Uitslag * @param string         $method
16642ea7f44SGerrit Uitslag * @param string         $tooltip
16742ea7f44SGerrit Uitslag * @param bool|string    $label  label text, false: lookup btn_$name in localization
168e824d633SMichael Große * @param string         $svg (optional) svg code, inserted into the button
16942ea7f44SGerrit Uitslag * @return string
170f3f0262cSandi */
171e824d633SMichael Großefunction html_btn($name, $id, $akey, $params, $method = 'get', $tooltip = '', $label = false, $svg = null) {
172f3f0262cSandi    global $conf;
173f3f0262cSandi    global $lang;
174f3f0262cSandi
175f5baf821SAnika Henke    if (!$label)
176f3f0262cSandi        $label = $lang['btn_'.$name];
177f3f0262cSandi
17849c713a3Sandi    //filter id (without urlencoding)
17949c713a3Sandi    $id = idfilter($id,false);
180f3f0262cSandi
181f3f0262cSandi    //make nice URLs even for buttons
1826c7843b5Sandi    if ($conf['userewrite'] == 2) {
1836c7843b5Sandi        $script = DOKU_BASE.DOKU_SCRIPT.'/'.$id;
1846c7843b5Sandi    } elseif ($conf['userewrite']) {
1856c7843b5Sandi        $script = DOKU_BASE.$id;
1866c7843b5Sandi    } else {
1878b00ebcfSandi        $script = DOKU_BASE.DOKU_SCRIPT;
188f3f0262cSandi        $params['id'] = $id;
189f3f0262cSandi    }
190f3f0262cSandi
1917afe5d93SSatoshi Sahara    $html = '<form class="button btn_'.$name.'" method="'.$method.'" action="'.$script.'"><div class="no">';
192f3f0262cSandi
19306a4bf8fSAndreas Gohr    if (is_array($params)) {
1949e491c01SAndreas Gohr        foreach ($params as $key => $val) {
1957afe5d93SSatoshi Sahara            $html .= '<input type="hidden" name="'.$key.'" value="'.hsc($val).'" />';
196f3f0262cSandi        }
19706a4bf8fSAndreas Gohr    }
198f3f0262cSandi
1997afe5d93SSatoshi Sahara    $tip = empty($tooltip) ? hsc($label) : hsc($tooltip);
20011ea018fSAndreas Gohr
2017afe5d93SSatoshi Sahara    $html .= '<button type="submit" ';
20211ea018fSAndreas Gohr    if ($akey) {
20307493d05SAnika Henke        $tip  .= ' ['.strtoupper($akey).']';
2047afe5d93SSatoshi Sahara        $html .= 'accesskey="'.$akey.'" ';
20535dae8b0SBen Coburn    }
2067afe5d93SSatoshi Sahara    $html .= 'title="'.$tip.'">';
207e824d633SMichael Große    if ($svg) {
2087afe5d93SSatoshi Sahara        $html .= '<span>'. hsc($label) .'</span>'. inlineSVG($svg);
209679dba01SMichael Große    } else {
2107afe5d93SSatoshi Sahara        $html .= hsc($label);
211679dba01SMichael Große    }
2127afe5d93SSatoshi Sahara    $html .= '</button>';
2137afe5d93SSatoshi Sahara    $html .= '</div></form>';
214f3f0262cSandi
2157afe5d93SSatoshi Sahara    return $html;
216f3f0262cSandi}
2170747f5d7Sghi/**
2180747f5d7Sghi * show a revision warning
2190747f5d7Sghi *
2200747f5d7Sghi * @author Szymon Olewniczak <dokuwiki@imz.re>
22187f229e8SSatoshi Sahara * @deprecated 2020-07-18
2220747f5d7Sghi */
223c8556525Sghifunction html_showrev() {
22487f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\PageView::class .'::showrev()');
2250747f5d7Sghi}
226f3f0262cSandi
227f3f0262cSandi/**
22842ea7f44SGerrit Uitslag * Show a wiki page
22915fae107Sandi *
23015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
23142ea7f44SGerrit Uitslag *
23242ea7f44SGerrit Uitslag * @param null|string $txt wiki text or null for showing $ID
233bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
23415fae107Sandi */
23511c78c94SAndreas Gohrfunction html_show($txt=null) {
23687f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\PageView::class .'::show()');
237bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\PageView($txt))->show();
238f3f0262cSandi}
239f3f0262cSandi
240f3f0262cSandi/**
241ee4c4a1bSAndreas Gohr * ask the user about how to handle an exisiting draft
242ee4c4a1bSAndreas Gohr *
243ee4c4a1bSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
244bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
245ee4c4a1bSAndreas Gohr */
246ee4c4a1bSAndreas Gohrfunction html_draft() {
24787f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Draft::class .'::show()');
248bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Draft)->show();
249ee4c4a1bSAndreas Gohr}
250ee4c4a1bSAndreas Gohr
251ee4c4a1bSAndreas Gohr/**
252f3f0262cSandi * Highlights searchqueries in HTML code
25315fae107Sandi *
25415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
2557209be23SAndreas Gohr * @author Harry Fuecks <hfuecks@gmail.com>
25642ea7f44SGerrit Uitslag *
25742ea7f44SGerrit Uitslag * @param string $html
25842ea7f44SGerrit Uitslag * @param array|string $phrases
25942ea7f44SGerrit Uitslag * @return string html
260f3f0262cSandi */
261546d3a99SAndreas Gohrfunction html_hilight($html, $phrases) {
2628a803caeSAndreas Gohr    $phrases = (array) $phrases;
2638a803caeSAndreas Gohr    $phrases = array_map('preg_quote_cb', $phrases);
2648a803caeSAndreas Gohr    $phrases = array_map('ft_snippet_re_preprocess', $phrases);
2658a803caeSAndreas Gohr    $phrases = array_filter($phrases);
2668a803caeSAndreas Gohr    $regex = join('|',$phrases);
26760c15d7dSAndreas Gohr
26860c15d7dSAndreas Gohr    if ($regex === '') return $html;
2698cbc5ee8SAndreas Gohr    if (!\dokuwiki\Utf8\Clean::isUtf8($regex)) return $html;
270f3f0262cSandi
271675d8ce4SSatoshi Sahara    $html = @preg_replace_callback("/((<[^>]*)|$regex)/ui", function ($match) {
272675d8ce4SSatoshi Sahara        $hlight = unslash($match[0]);
273675d8ce4SSatoshi Sahara        if (!isset($match[2])) {
274688774a0SAnika Henke            $hlight = '<span class="search_hit">'.$hlight.'</span>';
2757209be23SAndreas Gohr        }
2767209be23SAndreas Gohr        return $hlight;
277675d8ce4SSatoshi Sahara    }, $html);
278675d8ce4SSatoshi Sahara    return $html;
2797209be23SAndreas Gohr}
2807209be23SAndreas Gohr
2817209be23SAndreas Gohr/**
28215fae107Sandi * Display error on locked pages
28315fae107Sandi *
28415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
2857afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Locked::tplContent()
28615fae107Sandi */
287ee20e7d1Sandifunction html_locked() {
288a215faf2SSatoshi Sahara    dbg_deprecated(\dokuwiki\Action\Locked::class .'::showBanner()');
289a215faf2SSatoshi Sahara    (new dokuwiki\Action\Locked())->showBanner();
290f3f0262cSandi}
291f3f0262cSandi
29215fae107Sandi/**
29315fae107Sandi * list old revisions
29415fae107Sandi *
29515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
29671726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
2978e69fd30SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
298e0c26282SGerrit Uitslag *
299e0c26282SGerrit Uitslag * @param int $first skip the first n changelog lines
300e0c26282SGerrit Uitslag * @param bool|string $media_id id of media, or false for current page
301bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
30215fae107Sandi */
3038e69fd30SKate Arzamastsevafunction html_revisions($first = 0, $media_id = false) {
304*b370ebcdSSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\PageRevisions::class .'::show()');
305*b370ebcdSSatoshi Sahara    if ($media_id) {
306*b370ebcdSSatoshi Sahara        (new dokuwiki\Ui\MediaRevisions($media_id))->show($first);
307*b370ebcdSSatoshi Sahara    } else {
308*b370ebcdSSatoshi Sahara        global $INFO;
309*b370ebcdSSatoshi Sahara        (new dokuwiki\Ui\PageRevisions($INFO['id']))->show($first);
310*b370ebcdSSatoshi Sahara    }
311f3f0262cSandi}
312f3f0262cSandi
31315fae107Sandi/**
31415fae107Sandi * display recent changes
31515fae107Sandi *
31615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
3175749f1ceSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
31871726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
3198d40b4b6SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
32042ea7f44SGerrit Uitslag *
32142ea7f44SGerrit Uitslag * @param int $first
32242ea7f44SGerrit Uitslag * @param string $show_changes
323bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
32415fae107Sandi */
3250739a638SKate Arzamastsevafunction html_recent($first = 0, $show_changes = 'both') {
32687f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Recent::class .'::show()');
327bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Recent($first, $show_changes))->show();
328f3f0262cSandi}
329f3f0262cSandi
33015fae107Sandi/**
33115fae107Sandi * Display page index
33215fae107Sandi *
33315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
33442ea7f44SGerrit Uitslag *
33542ea7f44SGerrit Uitslag * @param string $ns
336bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
33715fae107Sandi */
338f3f0262cSandifunction html_index($ns) {
33987f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Index::class .'::show()');
340bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Index($ns))->show();
341f3f0262cSandi}
342f3f0262cSandi
343f3f0262cSandi/**
34489b939d7SSatoshi Sahara * Index tree item formatter for html_buildlist()
34515fae107Sandi *
346f3f0262cSandi * User function for html_buildlist()
34715fae107Sandi *
34815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
34942ea7f44SGerrit Uitslag *
35042ea7f44SGerrit Uitslag * @param array $item
35142ea7f44SGerrit Uitslag * @return string
3529c8632b4SSatoshi Sahara * @deprecated 2020-07-18
353f3f0262cSandi */
3549c8632b4SSatoshi Saharafunction html_list_index($item) {
35587f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Index::class .'::formatListItem()');
3569c8632b4SSatoshi Sahara    return (new dokuwiki\Ui\Index)->formatListItem($item);
357f3f0262cSandi}
358f3f0262cSandi
359f3f0262cSandi/**
36089b939d7SSatoshi Sahara * Index list item formatter for html_buildlist()
361cb70c441Sandi *
362a1dee2b9SAdrian Lang * This user function is used in html_buildlist to build the
363cb70c441Sandi * <li> tags for namespaces when displaying the page index
364cb70c441Sandi * it gives different classes to opened or closed "folders"
365cb70c441Sandi *
366cb70c441Sandi * @author Andreas Gohr <andi@splitbrain.org>
36742ea7f44SGerrit Uitslag *
36842ea7f44SGerrit Uitslag * @param array $item
36942ea7f44SGerrit Uitslag * @return string html
3709c8632b4SSatoshi Sahara * @deprecated 2020-07-18
371cb70c441Sandi */
3729c8632b4SSatoshi Saharafunction html_li_index($item) {
37387f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Index::class .'::tagListItem()');
3749c8632b4SSatoshi Sahara    return (new dokuwiki\Ui\Index)->tagListItem($item);
375cb70c441Sandi}
376cb70c441Sandi
377cb70c441Sandi/**
37889b939d7SSatoshi Sahara * Default list item formatter for html_buildlist()
37989b939d7SSatoshi Sahara *
38089b939d7SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org>
38189b939d7SSatoshi Sahara *
38289b939d7SSatoshi Sahara * @param array $item
38389b939d7SSatoshi Sahara * @return string html
38489b939d7SSatoshi Sahara * @deprecated 2020-07-18
38589b939d7SSatoshi Sahara */
38689b939d7SSatoshi Saharafunction html_li_default($item){
38789b939d7SSatoshi Sahara    return '<li class="level'.$item['level'].'">';
38889b939d7SSatoshi Sahara}
38989b939d7SSatoshi Sahara
39089b939d7SSatoshi Sahara/**
39115fae107Sandi * Build an unordered list
39215fae107Sandi *
393f3f0262cSandi * Build an unordered list from the given $data array
394f3f0262cSandi * Each item in the array has to have a 'level' property
395f3f0262cSandi * the item itself gets printed by the given $func user
396cb70c441Sandi * function. The second and optional function is used to
397cb70c441Sandi * print the <li> tag. Both user function need to accept
398cb70c441Sandi * a single item.
39915fae107Sandi *
400c5a8fd96SAndreas Gohr * Both user functions can be given as array to point to
401c5a8fd96SAndreas Gohr * a member of an object.
402c5a8fd96SAndreas Gohr *
40315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
40480679bafSGerrit Uitslag *
40580679bafSGerrit Uitslag * @param array    $data  array with item arrays
40680679bafSGerrit Uitslag * @param string   $class class of ul wrapper
40780679bafSGerrit Uitslag * @param callable $func  callback to print an list item
408bde560b4SSatoshi Sahara * @param callable $lifunc (optional) callback to the opening li tag
409bde560b4SSatoshi Sahara * @param bool     $forcewrapper (optional) Trigger building a wrapper ul if the first level is
410ae614416SAnika Henke *                               0 (we have a root object) or 1 (just the root content)
41180679bafSGerrit Uitslag * @return string html of an unordered list
412f3f0262cSandi */
413bde560b4SSatoshi Saharafunction html_buildlist($data, $class, $func, $lifunc = null, $forcewrapper = false) {
414a1dee2b9SAdrian Lang    if (count($data) === 0) {
415a1dee2b9SAdrian Lang        return '';
416a1dee2b9SAdrian Lang    }
417a1dee2b9SAdrian Lang
4182689c55fSMichael Große    $firstElement = reset($data);
4192689c55fSMichael Große    $start_level = $firstElement['level'];
4209e4f7880SAdrian Lang    $level = $start_level;
4219c8632b4SSatoshi Sahara    $html  = '';
422434f5921SHakan Sandell    $open  = 0;
4239e4f7880SAdrian Lang
424bde560b4SSatoshi Sahara    // set callback function to build the <li> tag, formerly defined as html_li_default()
425bde560b4SSatoshi Sahara    if (!is_callable($lifunc)) {
4269c8632b4SSatoshi Sahara       $lifunc = function ($item) {
4279c8632b4SSatoshi Sahara           return '<li class="level'.$item['level'].'">';
4289c8632b4SSatoshi Sahara       };
429bde560b4SSatoshi Sahara    }
430bde560b4SSatoshi Sahara
431f3f0262cSandi    foreach ($data as $item) {
432f3f0262cSandi        if ($item['level'] > $level) {
433f3f0262cSandi            //open new list
434df52d0feSandi            for ($i = 0; $i < ($item['level'] - $level); $i++) {
4359c8632b4SSatoshi Sahara                if ($i) $html .= '<li class="clear">';
4369c8632b4SSatoshi Sahara                $html .= "\n".'<ul class="'.$class.'">'."\n";
437434f5921SHakan Sandell                $open++;
438df52d0feSandi            }
439434f5921SHakan Sandell            $level = $item['level'];
440434f5921SHakan Sandell
441f3f0262cSandi        } elseif ($item['level'] < $level) {
442f3f0262cSandi            //close last item
4439c8632b4SSatoshi Sahara            $html .= '</li>'."\n";
444434f5921SHakan Sandell            while ($level > $item['level'] && $open > 0 ) {
445f3f0262cSandi                //close higher lists
4469c8632b4SSatoshi Sahara                $html .= '</ul>'."\n".'</li>'."\n";
447434f5921SHakan Sandell                $level--;
448434f5921SHakan Sandell                $open--;
449f3f0262cSandi            }
4509c8632b4SSatoshi Sahara        } elseif ($html !== '') {
45187671313SHakan Sandell            //close previous item
4529c8632b4SSatoshi Sahara            $html .= '</li>'."\n";
453f3f0262cSandi        }
454f3f0262cSandi
455f3f0262cSandi        //print item
4569c8632b4SSatoshi Sahara        $html .= call_user_func($lifunc, $item);
4579c8632b4SSatoshi Sahara        $html .= '<div class="li">';
45834dbe711Schris
4599c8632b4SSatoshi Sahara        $html .= call_user_func($func, $item);
4609c8632b4SSatoshi Sahara        $html .= '</div>';
461f3f0262cSandi    }
462f3f0262cSandi
463f3f0262cSandi    //close remaining items and lists
4649c8632b4SSatoshi Sahara    $html .= '</li>'."\n";
465434f5921SHakan Sandell    while ($open-- > 0) {
4669c8632b4SSatoshi Sahara        $html .= '</ul></li>'."\n";
467434f5921SHakan Sandell    }
468434f5921SHakan Sandell
469434f5921SHakan Sandell    if ($forcewrapper || $start_level < 2) {
470434f5921SHakan Sandell        // Trigger building a wrapper ul if the first level is
471434f5921SHakan Sandell        // 0 (we have a root object) or 1 (just the root content)
4729c8632b4SSatoshi Sahara        $html = "\n".'<ul class="'.$class.'">'."\n".$html.'</ul>'."\n";
473f3f0262cSandi    }
474f3f0262cSandi
4759c8632b4SSatoshi Sahara    return $html;
476f3f0262cSandi}
477f3f0262cSandi
47815fae107Sandi/**
47915fae107Sandi * display backlinks
48015fae107Sandi *
48115fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
48211df47ecSMichael Klier * @author Michael Klier <chi@chimeric.de>
483bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
48415fae107Sandi */
485f3f0262cSandifunction html_backlinks() {
48687f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Backlinks::class .'::show()');
487bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Backlinks)->show();
48895b451bcSAdrian Lang}
48995b451bcSAdrian Lang
49015fae107Sandi/**
491a215faf2SSatoshi Sahara * Get header of diff HTML
492a215faf2SSatoshi Sahara *
493a215faf2SSatoshi Sahara * @param string $l_rev   Left revisions
494a215faf2SSatoshi Sahara * @param string $r_rev   Right revision
495a215faf2SSatoshi Sahara * @param string $id      Page id, if null $ID is used
496a215faf2SSatoshi Sahara * @param bool   $media   If it is for media files
497a215faf2SSatoshi Sahara * @param bool   $inline  Return the header on a single line
498a215faf2SSatoshi Sahara * @return string[] HTML snippets for diff header
499a215faf2SSatoshi Sahara * @deprecated 2020-07-18
500a215faf2SSatoshi Sahara */
501a215faf2SSatoshi Saharafunction html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = false) {
502a215faf2SSatoshi Sahara    dbg_deprecated('see '. \dokuwiki\Ui\Diff::class .'::diffHead()');
503a215faf2SSatoshi Sahara}
504a215faf2SSatoshi Sahara
505a215faf2SSatoshi Sahara/**
50604e99fe1SGerrit Uitslag * Show diff
507baf0c3e5SGerrit Uitslag * between current page version and provided $text
508baf0c3e5SGerrit Uitslag * or between the revisions provided via GET or POST
50915fae107Sandi *
51015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
511baf0c3e5SGerrit Uitslag * @param  string $text  when non-empty: compare with this text with most current version
51204e99fe1SGerrit Uitslag * @param  bool   $intro display the intro text
5138d5e837eSMichael Hamann * @param  string $type  type of the diff (inline or sidebyside)
514bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
51515fae107Sandi */
51672165381SAndreas Gohrfunction html_diff($text = '', $intro = true, $type = null) {
51787f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Diff::class .'::show()');
518bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Diff($text, $intro, $type))->show();
519fcfecb69SChristopher Smith}
520fcfecb69SChristopher Smith
52115fae107Sandi/**
522a215faf2SSatoshi Sahara * Create html for revision navigation
523a215faf2SSatoshi Sahara *
524a215faf2SSatoshi Sahara * @param PageChangeLog $pagelog changelog object of current page
525a215faf2SSatoshi Sahara * @param string        $type    inline vs sidebyside
526a215faf2SSatoshi Sahara * @param int           $l_rev   left revision timestamp
527a215faf2SSatoshi Sahara * @param int           $r_rev   right revision timestamp
528a215faf2SSatoshi Sahara * @return string[] html of left and right navigation elements
529a215faf2SSatoshi Sahara * @deprecated 2020-07-18
530a215faf2SSatoshi Sahara */
531a215faf2SSatoshi Saharafunction html_diff_navigation($pagelog, $type, $l_rev, $r_rev) {
532a215faf2SSatoshi Sahara    dbg_deprecated('see '. \dokuwiki\Ui\Diff::class .'::diffNavigation()');
533a215faf2SSatoshi Sahara}
534a215faf2SSatoshi Sahara
535a215faf2SSatoshi Sahara/**
536a215faf2SSatoshi Sahara * Create html link to a diff defined by two revisions
537a215faf2SSatoshi Sahara *
538a215faf2SSatoshi Sahara * @param string $difftype display type
539a215faf2SSatoshi Sahara * @param string $linktype
540a215faf2SSatoshi Sahara * @param int $lrev oldest revision
541a215faf2SSatoshi Sahara * @param int $rrev newest revision or null for diff with current revision
542a215faf2SSatoshi Sahara * @return string html of link to a diff
543a215faf2SSatoshi Sahara * @deprecated 2020-07-18
544a215faf2SSatoshi Sahara */
545a215faf2SSatoshi Saharafunction html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null) {
546a215faf2SSatoshi Sahara    dbg_deprecated('see '. \dokuwiki\Ui\Diff::class .'::diffViewlink()');
547a215faf2SSatoshi Sahara}
548a215faf2SSatoshi Sahara
549a215faf2SSatoshi Sahara/**
550a215faf2SSatoshi Sahara * Insert soft breaks in diff html
551a215faf2SSatoshi Sahara *
552a215faf2SSatoshi Sahara * @param string $diffhtml
553a215faf2SSatoshi Sahara * @return string
554a215faf2SSatoshi Sahara * @deprecated 2020-07-18
555a215faf2SSatoshi Sahara */
556a215faf2SSatoshi Saharafunction html_insert_softbreaks($diffhtml) {
557a215faf2SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Diff::class .'::insertSoftbreaks()');
558fda3dd81SSatoshi Sahara    return (new dokuwiki\Ui\Diff())->insertSoftbreaks($diffhtml);
559a215faf2SSatoshi Sahara}
560a215faf2SSatoshi Sahara
561a215faf2SSatoshi Sahara/**
56215fae107Sandi * show warning on conflict detection
56315fae107Sandi *
56415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
56542ea7f44SGerrit Uitslag *
56642ea7f44SGerrit Uitslag * @param string $text
56742ea7f44SGerrit Uitslag * @param string $summary
568bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
56915fae107Sandi */
570f3f0262cSandifunction html_conflict($text, $summary) {
57187f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Conflict::class .'::show()');
572bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Conflict($text, $summary))->show();
573f3f0262cSandi}
574f3f0262cSandi
575f3f0262cSandi/**
57615fae107Sandi * Prints the global message array
57715fae107Sandi *
57815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
579f3f0262cSandi */
580f3f0262cSandifunction html_msgarea() {
581cc58224cSMichael Hamann    global $MSG, $MSG_shown;
5828d5e837eSMichael Hamann    /** @var array $MSG */
583cc58224cSMichael Hamann    // store if the global $MSG has already been shown and thus HTML output has been started
584cc58224cSMichael Hamann    $MSG_shown = true;
585cc58224cSMichael Hamann
586f3f0262cSandi    if (!isset($MSG)) return;
587f3f0262cSandi
5884af9f0d4SAndreas Gohr    $shown = array();
589f3f0262cSandi    foreach ($MSG as $msg) {
5904af9f0d4SAndreas Gohr        $hash = md5($msg['msg']);
5914af9f0d4SAndreas Gohr        if (isset($shown[$hash])) continue; // skip double messages
592f755f9abSChristopher Smith        if (info_msg_allowed($msg)) {
593f3f0262cSandi            print '<div class="'.$msg['lvl'].'">';
594f3f0262cSandi            print $msg['msg'];
595f3f0262cSandi            print '</div>';
596d3bae478SChristopher Smith        }
5974af9f0d4SAndreas Gohr        $shown[$hash] = 1;
598f3f0262cSandi    }
599cc58224cSMichael Hamann
600cc58224cSMichael Hamann    unset($GLOBALS['MSG']);
601f3f0262cSandi}
602f3f0262cSandi
603f3f0262cSandi/**
604f3f0262cSandi * Prints the registration form
60515fae107Sandi *
60615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
607bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
608f3f0262cSandi */
609f3f0262cSandifunction html_register() {
61087f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\UserRegister::class .'::show()');
611bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\UserRegister)->show();
612f3f0262cSandi}
613f3f0262cSandi
614f3f0262cSandi/**
6158b06d178Schris * Print the update profile form
6168b06d178Schris *
6178b06d178Schris * @author Christopher Smith <chris@jalakai.co.uk>
6188b06d178Schris * @author Andreas Gohr <andi@splitbrain.org>
619bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
6208b06d178Schris */
6218b06d178Schrisfunction html_updateprofile() {
62287f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\UserProfile::class .'::show()');
623bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\UserProfile)->show();
6248b06d178Schris}
6258b06d178Schris
6268b06d178Schris/**
6277c4635c4SAdrian Lang * Preprocess edit form data
62815fae107Sandi *
62915fae107Sandi * @author   Andreas Gohr <andi@splitbrain.org>
6302ffea8f2SAdrian Lang *
631bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
632f3f0262cSandi */
6335a932e77SAdrian Langfunction html_edit() {
63487f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Editor::class .'::show()');
635bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Editor)->show();
636b6912aeaSAndreas Gohr}
637b6912aeaSAndreas Gohr
638b6912aeaSAndreas Gohr/**
639bf69f8cbSSatoshi Sahara * Display the default edit form
640bf69f8cbSSatoshi Sahara *
641bf69f8cbSSatoshi Sahara * Is the default action for HTML_EDIT_FORMSELECTION.
642bf69f8cbSSatoshi Sahara *
643bf69f8cbSSatoshi Sahara * @param mixed[] $param
644bf69f8cbSSatoshi Sahara * @deprecated 2020-07-18
645bf69f8cbSSatoshi Sahara */
646bf69f8cbSSatoshi Saharafunction html_edit_form($param) {
647bf69f8cbSSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\Editor::class .'::addTextarea()');
648bf69f8cbSSatoshi Sahara    return (new dokuwiki\Ui\Editor)->addTextarea($param);
649bf69f8cbSSatoshi Sahara}
650bf69f8cbSSatoshi Sahara
651bf69f8cbSSatoshi Sahara/**
652f3f0262cSandi * prints some debug info
65315fae107Sandi *
65415fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
655f3f0262cSandi */
656f3f0262cSandifunction html_debug() {
657f3f0262cSandi    global $conf;
658d16a4edaSandi    global $lang;
659e1d9dcc8SAndreas Gohr    /** @var AuthPlugin $auth */
6605298a619SAndreas Gohr    global $auth;
661100a97e3SAndreas Gohr    global $INFO;
662100a97e3SAndreas Gohr
66328fb55ffSandi    //remove sensitive data
66428fb55ffSandi    $cnf = $conf;
66524297a69SAndreas Gohr    debug_guard($cnf);
666100a97e3SAndreas Gohr    $nfo = $INFO;
66724297a69SAndreas Gohr    debug_guard($nfo);
668100a97e3SAndreas Gohr    $ses = $_SESSION;
66924297a69SAndreas Gohr    debug_guard($ses);
670f3f0262cSandi
671f3f0262cSandi    print '<html><body>';
672f3f0262cSandi
673f3f0262cSandi    print '<p>When reporting bugs please send all the following ';
674f3f0262cSandi    print 'output as a mail to andi@splitbrain.org ';
675f3f0262cSandi    print 'The best way to do this is to save this page in your browser</p>';
676f3f0262cSandi
677100a97e3SAndreas Gohr    print '<b>$INFO:</b><pre>';
678100a97e3SAndreas Gohr    print_r($nfo);
679100a97e3SAndreas Gohr    print '</pre>';
680100a97e3SAndreas Gohr
681f3f0262cSandi    print '<b>$_SERVER:</b><pre>';
682f3f0262cSandi    print_r($_SERVER);
683f3f0262cSandi    print '</pre>';
684f3f0262cSandi
685f3f0262cSandi    print '<b>$conf:</b><pre>';
68628fb55ffSandi    print_r($cnf);
687f3f0262cSandi    print '</pre>';
688f3f0262cSandi
689ed7b5f09Sandi    print '<b>DOKU_BASE:</b><pre>';
690ed7b5f09Sandi    print DOKU_BASE;
691f3f0262cSandi    print '</pre>';
692f3f0262cSandi
693ed7b5f09Sandi    print '<b>abs DOKU_BASE:</b><pre>';
694ed7b5f09Sandi    print DOKU_URL;
695ed7b5f09Sandi    print '</pre>';
696ed7b5f09Sandi
697ed7b5f09Sandi    print '<b>rel DOKU_BASE:</b><pre>';
698f3f0262cSandi    print dirname($_SERVER['PHP_SELF']).'/';
699f3f0262cSandi    print '</pre>';
700f3f0262cSandi
701f3f0262cSandi    print '<b>PHP Version:</b><pre>';
702f3f0262cSandi    print phpversion();
703f3f0262cSandi    print '</pre>';
704f3f0262cSandi
705f3f0262cSandi    print '<b>locale:</b><pre>';
706f3f0262cSandi    print setlocale(LC_ALL,0);
707f3f0262cSandi    print '</pre>';
708f3f0262cSandi
709d16a4edaSandi    print '<b>encoding:</b><pre>';
710d16a4edaSandi    print $lang['encoding'];
711d16a4edaSandi    print '</pre>';
712d16a4edaSandi
7135298a619SAndreas Gohr    if ($auth) {
7145298a619SAndreas Gohr        print '<b>Auth backend capabilities:</b><pre>';
7152f46ade0SChristopher Smith        foreach ($auth->getCapabilities() as $cando) {
7167afe5d93SSatoshi Sahara            print '   '.str_pad($cando,16) .' => '. (int)$auth->canDo($cando) . DOKU_LF;
7172f46ade0SChristopher Smith        }
7185298a619SAndreas Gohr        print '</pre>';
7195298a619SAndreas Gohr    }
7205298a619SAndreas Gohr
7213aa54d7cSAndreas Gohr    print '<b>$_SESSION:</b><pre>';
722100a97e3SAndreas Gohr    print_r($ses);
7233aa54d7cSAndreas Gohr    print '</pre>';
7243aa54d7cSAndreas Gohr
725f3f0262cSandi    print '<b>Environment:</b><pre>';
726f3f0262cSandi    print_r($_ENV);
727f3f0262cSandi    print '</pre>';
728f3f0262cSandi
729f3f0262cSandi    print '<b>PHP settings:</b><pre>';
730f3f0262cSandi    $inis = ini_get_all();
731f3f0262cSandi    print_r($inis);
732f3f0262cSandi    print '</pre>';
733f3f0262cSandi
734e89b7c1eSChristopher Smith    if (function_exists('apache_get_version')) {
73559bc3b48SGerrit Uitslag        $apache = array();
736e89b7c1eSChristopher Smith        $apache['version'] = apache_get_version();
737e89b7c1eSChristopher Smith
738e89b7c1eSChristopher Smith        if (function_exists('apache_get_modules')) {
739e89b7c1eSChristopher Smith            $apache['modules'] = apache_get_modules();
740e89b7c1eSChristopher Smith        }
741e89b7c1eSChristopher Smith        print '<b>Apache</b><pre>';
742e89b7c1eSChristopher Smith        print_r($apache);
743e89b7c1eSChristopher Smith        print '</pre>';
744e89b7c1eSChristopher Smith    }
745e89b7c1eSChristopher Smith
746f3f0262cSandi    print '</body></html>';
747f3f0262cSandi}
748f3f0262cSandi
74910271ce4SAndreas Gohr/**
7508b06d178Schris * Form to request a new password for an existing account
7518b06d178Schris *
7528b06d178Schris * @author Benoit Chesneau <benoit@bchesneau.info>
753cc204bbdSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de>
754bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
75511e2ce22Schris */
7568b06d178Schrisfunction html_resendpwd() {
75787f229e8SSatoshi Sahara    dbg_deprecated(\dokuwiki\Ui\UserResendPwd::class .'::show()');
758bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\UserResendPwd)->show();
759cc204bbdSAndreas Gohr}
760cc204bbdSAndreas Gohr
761fdb8d77bSTom N Harris/**
762b8595a66SAndreas Gohr * Return the TOC rendered to XHTML
763b8595a66SAndreas Gohr *
764b8595a66SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
76542ea7f44SGerrit Uitslag *
76642ea7f44SGerrit Uitslag * @param array $toc
76742ea7f44SGerrit Uitslag * @return string html
768b8595a66SAndreas Gohr */
769b8595a66SAndreas Gohrfunction html_TOC($toc) {
770b8595a66SAndreas Gohr    if (!count($toc)) return '';
771b8595a66SAndreas Gohr    global $lang;
772b8595a66SAndreas Gohr    $out  = '<!-- TOC START -->'.DOKU_LF;
773158a5bffSDeathCamel57    $out .= '<div id="dw__toc" class="dw__toc">'.DOKU_LF;
77448722ac8SAnika Henke    $out .= '<h3 class="toggle">';
775b8595a66SAndreas Gohr    $out .= $lang['toc'];
776d5acc30dSAnika Henke    $out .= '</h3>'.DOKU_LF;
777d5acc30dSAnika Henke    $out .= '<div>'.DOKU_LF;
778bde560b4SSatoshi Sahara    $out .= html_buildlist($toc, 'toc', 'html_list_toc', null, true);
779b8595a66SAndreas Gohr    $out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF;
780b8595a66SAndreas Gohr    $out .= '<!-- TOC END -->'.DOKU_LF;
781db959ae3SAndreas Gohr    return $out;
782db959ae3SAndreas Gohr}
783b8595a66SAndreas Gohr
784b8595a66SAndreas Gohr/**
785b8595a66SAndreas Gohr * Callback for html_buildlist
78642ea7f44SGerrit Uitslag *
78742ea7f44SGerrit Uitslag * @param array $item
78842ea7f44SGerrit Uitslag * @return string html
789b8595a66SAndreas Gohr */
790b8595a66SAndreas Gohrfunction html_list_toc($item) {
791c66972f2SAdrian Lang    if (isset($item['hid'])){
7927d91652aSAndreas Gohr        $link = '#'.$item['hid'];
7937d91652aSAndreas Gohr    } else {
7947d91652aSAndreas Gohr        $link = $item['link'];
7957d91652aSAndreas Gohr    }
7967d91652aSAndreas Gohr
797d5acc30dSAnika Henke    return '<a href="'.$link.'">'.hsc($item['title']).'</a>';
798b8595a66SAndreas Gohr}
799b8595a66SAndreas Gohr
800b8595a66SAndreas Gohr/**
801b8595a66SAndreas Gohr * Helper function to build TOC items
802b8595a66SAndreas Gohr *
803b8595a66SAndreas Gohr * Returns an array ready to be added to a TOC array
804b8595a66SAndreas Gohr *
805b8595a66SAndreas Gohr * @param string $link  - where to link (if $hash set to '#' it's a local anchor)
806b8595a66SAndreas Gohr * @param string $text  - what to display in the TOC
807b8595a66SAndreas Gohr * @param int    $level - nesting level
808b8595a66SAndreas Gohr * @param string $hash  - is prepended to the given $link, set blank if you want full links
8098d5e837eSMichael Hamann * @return array the toc item
810b8595a66SAndreas Gohr */
811b8595a66SAndreas Gohrfunction html_mktocitem($link, $text, $level, $hash='#') {
812bde560b4SSatoshi Sahara    return  array(
813bde560b4SSatoshi Sahara            'link'  => $hash.$link,
814b8595a66SAndreas Gohr            'title' => $text,
815b8595a66SAndreas Gohr            'type'  => 'ul',
816bde560b4SSatoshi Sahara            'level' => $level
817bde560b4SSatoshi Sahara    );
818b8595a66SAndreas Gohr}
819b8595a66SAndreas Gohr
820b8595a66SAndreas Gohr/**
821fdb8d77bSTom N Harris * Output a Doku_Form object.
822fdb8d77bSTom N Harris * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT
823fdb8d77bSTom N Harris *
824fdb8d77bSTom N Harris * @author Tom N Harris <tnharris@whoopdedo.org>
82542ea7f44SGerrit Uitslag *
8268d5e837eSMichael Hamann * @param string     $name The name of the form
8278d5e837eSMichael Hamann * @param Doku_Form  $form The form
8282162df3aSSatoshi Sahara * @return void
8292162df3aSSatoshi Sahara * @deprecated 2020-07-18
830fdb8d77bSTom N Harris */
831c29600d0SSatoshi Saharafunction html_form($name, $form) {
8328a5f08afSSatoshi Sahara    dbg_deprecated('use dokuwiki\Form\Form instead of Doku_Form');
833fdb8d77bSTom N Harris    // Safety check in case the caller forgets.
834fdb8d77bSTom N Harris    $form->endFieldset();
835cbb44eabSAndreas Gohr    Event::createAndTrigger('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false);
836fdb8d77bSTom N Harris}
837fdb8d77bSTom N Harris
838fdb8d77bSTom N Harris/**
839fdb8d77bSTom N Harris * Form print function.
840c29600d0SSatoshi Sahara * Just calls printForm() on the form object.
84142ea7f44SGerrit Uitslag *
842c29600d0SSatoshi Sahara * @param Doku_Form $form The form
8432162df3aSSatoshi Sahara * @return void
8442162df3aSSatoshi Sahara * @deprecated 2020-07-18
845fdb8d77bSTom N Harris */
84625dd2a2fSSatoshi Saharafunction html_form_output($form) {
8478a5f08afSSatoshi Sahara    dbg_deprecated('use dokuwiki\Form\Form::toHTML()');
84825dd2a2fSSatoshi Sahara    $form->printForm();
84925dd2a2fSSatoshi Sahara}
850340756e4Sandi
85107bf32b2SAndreas Gohr/**
85207bf32b2SAndreas Gohr * Embed a flash object in HTML
85307bf32b2SAndreas Gohr *
85407bf32b2SAndreas Gohr * This will create the needed HTML to embed a flash movie in a cross browser
85507bf32b2SAndreas Gohr * compatble way using valid XHTML
85607bf32b2SAndreas Gohr *
85707bf32b2SAndreas Gohr * The parameters $params, $flashvars and $atts need to be associative arrays.
85807bf32b2SAndreas Gohr * No escaping needs to be done for them. The alternative content *has* to be
85907bf32b2SAndreas Gohr * escaped because it is used as is. If no alternative content is given
86007bf32b2SAndreas Gohr * $lang['noflash'] is used.
86107bf32b2SAndreas Gohr *
86207bf32b2SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
86307bf32b2SAndreas Gohr * @link   http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml
86407bf32b2SAndreas Gohr *
86507bf32b2SAndreas Gohr * @param string $swf      - the SWF movie to embed
86607bf32b2SAndreas Gohr * @param int $width       - width of the flash movie in pixels
86707bf32b2SAndreas Gohr * @param int $height      - height of the flash movie in pixels
86807bf32b2SAndreas Gohr * @param array $params    - additional parameters (<param>)
86907bf32b2SAndreas Gohr * @param array $flashvars - parameters to be passed in the flashvar parameter
87007bf32b2SAndreas Gohr * @param array $atts      - additional attributes for the <object> tag
87107bf32b2SAndreas Gohr * @param string $alt      - alternative content (is NOT automatically escaped!)
872b3d1090eSMichael Hamann * @return string         - the XHTML markup
87307bf32b2SAndreas Gohr */
87407bf32b2SAndreas Gohrfunction html_flashobject($swf,$width,$height,$params=null,$flashvars=null,$atts=null,$alt=''){
87507bf32b2SAndreas Gohr    global $lang;
87607bf32b2SAndreas Gohr
87707bf32b2SAndreas Gohr    $out = '';
87807bf32b2SAndreas Gohr
87907bf32b2SAndreas Gohr    // prepare the object attributes
88007bf32b2SAndreas Gohr    if(is_null($atts)) $atts = array();
88107bf32b2SAndreas Gohr    $atts['width']  = (int) $width;
882d4c61e61SAndreas Gohr    $atts['height'] = (int) $height;
88307bf32b2SAndreas Gohr    if(!$atts['width'])  $atts['width']  = 425;
88407bf32b2SAndreas Gohr    if(!$atts['height']) $atts['height'] = 350;
88507bf32b2SAndreas Gohr
88607bf32b2SAndreas Gohr    // add object attributes for standard compliant browsers
88707bf32b2SAndreas Gohr    $std = $atts;
88807bf32b2SAndreas Gohr    $std['type'] = 'application/x-shockwave-flash';
88907bf32b2SAndreas Gohr    $std['data'] = $swf;
89007bf32b2SAndreas Gohr
89107bf32b2SAndreas Gohr    // add object attributes for IE
89207bf32b2SAndreas Gohr    $ie  = $atts;
89307bf32b2SAndreas Gohr    $ie['classid'] = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
89407bf32b2SAndreas Gohr
89507bf32b2SAndreas Gohr    // open object (with conditional comments)
89607bf32b2SAndreas Gohr    $out .= '<!--[if !IE]> -->'.NL;
89707bf32b2SAndreas Gohr    $out .= '<object '.buildAttributes($std).'>'.NL;
89807bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->'.NL;
89907bf32b2SAndreas Gohr    $out .= '<!--[if IE]>'.NL;
90007bf32b2SAndreas Gohr    $out .= '<object '.buildAttributes($ie).'>'.NL;
90107bf32b2SAndreas Gohr    $out .= '    <param name="movie" value="'.hsc($swf).'" />'.NL;
9029ae41cdcSAndreas Gohr    $out .= '<!--><!-- -->'.NL;
90307bf32b2SAndreas Gohr
90407bf32b2SAndreas Gohr    // print params
90507bf32b2SAndreas Gohr    if(is_array($params)) foreach($params as $key => $val){
90607bf32b2SAndreas Gohr        $out .= '  <param name="'.hsc($key).'" value="'.hsc($val).'" />'.NL;
90707bf32b2SAndreas Gohr    }
90807bf32b2SAndreas Gohr
90907bf32b2SAndreas Gohr    // add flashvars
91007bf32b2SAndreas Gohr    if(is_array($flashvars)){
911d4c61e61SAndreas Gohr        $out .= '  <param name="FlashVars" value="'.buildURLparams($flashvars).'" />'.NL;
91207bf32b2SAndreas Gohr    }
91307bf32b2SAndreas Gohr
91407bf32b2SAndreas Gohr    // alternative content
91507bf32b2SAndreas Gohr    if($alt){
91607bf32b2SAndreas Gohr        $out .= $alt.NL;
91707bf32b2SAndreas Gohr    }else{
91807bf32b2SAndreas Gohr        $out .= $lang['noflash'].NL;
91907bf32b2SAndreas Gohr    }
92007bf32b2SAndreas Gohr
92107bf32b2SAndreas Gohr    // finish
92207bf32b2SAndreas Gohr    $out .= '</object>'.NL;
92307bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->'.NL;
92407bf32b2SAndreas Gohr
92507bf32b2SAndreas Gohr    return $out;
92607bf32b2SAndreas Gohr}
92707bf32b2SAndreas Gohr
9288d5e837eSMichael Hamann/**
9298d5e837eSMichael Hamann * Prints HTML code for the given tab structure
9308d5e837eSMichael Hamann *
9318d5e837eSMichael Hamann * @param array  $tabs        tab structure
9328d5e837eSMichael Hamann * @param string $current_tab the current tab id
9332162df3aSSatoshi Sahara * @return void
9348d5e837eSMichael Hamann */
93595b451bcSAdrian Langfunction html_tabs($tabs, $current_tab = null) {
93694add303SAnika Henke    echo '<ul class="tabs">'.NL;
93795b451bcSAdrian Lang
93895b451bcSAdrian Lang    foreach ($tabs as $id => $tab) {
93995b451bcSAdrian Lang        html_tab($tab['href'], $tab['caption'], $id === $current_tab);
94095b451bcSAdrian Lang    }
94195b451bcSAdrian Lang
94294add303SAnika Henke    echo '</ul>'.NL;
94395b451bcSAdrian Lang}
944cd2a4cfdSAnika Henke
94595b451bcSAdrian Lang/**
94695b451bcSAdrian Lang * Prints a single tab
94795b451bcSAdrian Lang *
94895b451bcSAdrian Lang * @author Kate Arzamastseva <pshns@ukr.net>
94995b451bcSAdrian Lang * @author Adrian Lang <mail@adrianlang.de>
95095b451bcSAdrian Lang *
95195b451bcSAdrian Lang * @param string $href - tab href
95295b451bcSAdrian Lang * @param string $caption - tab caption
95395b451bcSAdrian Lang * @param boolean $selected - is tab selected
9542162df3aSSatoshi Sahara * @return void
95595b451bcSAdrian Lang */
95695b451bcSAdrian Lang
95795b451bcSAdrian Langfunction html_tab($href, $caption, $selected = false) {
95895b451bcSAdrian Lang    $tab = '<li>';
95995b451bcSAdrian Lang    if ($selected) {
96095b451bcSAdrian Lang        $tab .= '<strong>';
96195b451bcSAdrian Lang    } else {
96295b451bcSAdrian Lang        $tab .= '<a href="' . hsc($href) . '">';
96395b451bcSAdrian Lang    }
96495b451bcSAdrian Lang    $tab .= hsc($caption)
96595b451bcSAdrian Lang         .  '</' . ($selected ? 'strong' : 'a') . '>'
96694add303SAnika Henke         .  '</li>'.NL;
96795b451bcSAdrian Lang    echo $tab;
96895b451bcSAdrian Lang}
96995b451bcSAdrian Lang
970cd2a4cfdSAnika Henke/**
971cd2a4cfdSAnika Henke * Display size change
972cd2a4cfdSAnika Henke *
973cd2a4cfdSAnika Henke * @param int $sizechange - size of change in Bytes
974e34d6962SSatoshi Sahara * @param Doku_Form $form - (optional) form to add elements to
975e34d6962SSatoshi Sahara * @return void|string
976cd2a4cfdSAnika Henke */
977e34d6962SSatoshi Saharafunction html_sizechange($sizechange, $form = null) {
978cd2a4cfdSAnika Henke    if (isset($sizechange)) {
979cd2a4cfdSAnika Henke        $class = 'sizechange';
980cd2a4cfdSAnika Henke        $value = filesize_h(abs($sizechange));
981cd2a4cfdSAnika Henke        if ($sizechange > 0) {
982cd2a4cfdSAnika Henke            $class .= ' positive';
983cd2a4cfdSAnika Henke            $value = '+' . $value;
984cd2a4cfdSAnika Henke        } elseif ($sizechange < 0) {
985cd2a4cfdSAnika Henke            $class .= ' negative';
986cd2a4cfdSAnika Henke            $value = '-' . $value;
9870b78a6edSAnika Henke        } else {
9880b78a6edSAnika Henke            $value = '±' . $value;
989cd2a4cfdSAnika Henke        }
990e34d6962SSatoshi Sahara        if (!isset($form)) {
991e34d6962SSatoshi Sahara            return '<span class="'.$class.'">'.$value.'</span>';
992b0f23f4eSSatoshi Sahara        } else { // Doku_Form
993cd2a4cfdSAnika Henke            $form->addElement(form_makeOpenTag('span', array('class' => $class)));
994cd2a4cfdSAnika Henke            $form->addElement($value);
995cd2a4cfdSAnika Henke            $form->addElement(form_makeCloseTag('span'));
996cd2a4cfdSAnika Henke        }
997cd2a4cfdSAnika Henke    }
998b0f23f4eSSatoshi Sahara}
999