xref: /dokuwiki/inc/html.php (revision 7afe5d9314ac4f054dee758a24c337cf417dfbc6)
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) {
47bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Login($svg))->show();
48f3f0262cSandi}
49f3f0262cSandi
50d59dea9fSGerrit Uitslag
51d59dea9fSGerrit Uitslag/**
52d59dea9fSGerrit Uitslag * Denied page content
53d59dea9fSGerrit Uitslag *
54d59dea9fSGerrit Uitslag * @return string html
55*7afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Denied::tplContent()
56d59dea9fSGerrit Uitslag */
57d59dea9fSGerrit Uitslagfunction html_denied() {
58d59dea9fSGerrit Uitslag}
59d59dea9fSGerrit Uitslag
60f3f0262cSandi/**
6115fae107Sandi * inserts section edit buttons if wanted or removes the markers
6215fae107Sandi *
6315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
6442ea7f44SGerrit Uitslag *
6542ea7f44SGerrit Uitslag * @param string $text
6642ea7f44SGerrit Uitslag * @param bool   $show show section edit buttons?
6742ea7f44SGerrit Uitslag * @return string
6815fae107Sandi */
69f3f0262cSandifunction html_secedit($text, $show = true) {
70f3f0262cSandi    global $INFO;
7135dae8b0SBen Coburn
72aac83cd4SPhy    if ((isset($INFO) && !$INFO['writable']) || !$show || (isset($INFO) && $INFO['rev'])) {
732d3b082eSMichael Große        return preg_replace(SEC_EDIT_PATTERN,'',$text);
74f3f0262cSandi    }
7535dae8b0SBen Coburn
762d3b082eSMichael Große    return preg_replace_callback(SEC_EDIT_PATTERN,
7740868f2fSAdrian Lang                'html_secedit_button', $text);
7840868f2fSAdrian Lang}
7940868f2fSAdrian Lang
8040868f2fSAdrian Lang/**
8140868f2fSAdrian Lang * prepares section edit button data for event triggering
8240868f2fSAdrian Lang * used as a callback in html_secedit
8340868f2fSAdrian Lang *
8440868f2fSAdrian Lang * @author Andreas Gohr <andi@splitbrain.org>
8542ea7f44SGerrit Uitslag *
8642ea7f44SGerrit Uitslag * @param array $matches matches with regexp
8742ea7f44SGerrit Uitslag * @return string
8842ea7f44SGerrit Uitslag * @triggers HTML_SECEDIT_BUTTON
8940868f2fSAdrian Lang */
9040868f2fSAdrian Langfunction html_secedit_button($matches){
91ada0d779SMichael Hamann    $json = htmlspecialchars_decode($matches[1], ENT_QUOTES);
92ada0d779SMichael Hamann    $data = json_decode($json, true);
93ec57f119SLarsDW223    if ($data == NULL) {
94ec57f119SLarsDW223        return;
9506917fceSMichael Große    }
96ec57f119SLarsDW223    $data ['target'] = strtolower($data['target']);
97ec57f119SLarsDW223    $data ['hid'] = strtolower($data['hid']);
9840868f2fSAdrian Lang
99cbb44eabSAndreas Gohr    return Event::createAndTrigger('HTML_SECEDIT_BUTTON', $data,
10040868f2fSAdrian Lang                         'html_secedit_get_button');
10140868f2fSAdrian Lang}
10240868f2fSAdrian Lang
10340868f2fSAdrian Lang/**
10440868f2fSAdrian Lang * prints a section editing button
10540868f2fSAdrian Lang * used as default action form HTML_SECEDIT_BUTTON
10640868f2fSAdrian Lang *
10740868f2fSAdrian Lang * @author Adrian Lang <lang@cosmocode.de>
10842ea7f44SGerrit Uitslag *
10942ea7f44SGerrit Uitslag * @param array $data name, section id and target
11042ea7f44SGerrit Uitslag * @return string html
11140868f2fSAdrian Lang */
11240868f2fSAdrian Langfunction html_secedit_get_button($data) {
11340868f2fSAdrian Lang    global $ID;
11440868f2fSAdrian Lang    global $INFO;
11540868f2fSAdrian Lang
1166d9eab4dSMichael Hamann    if (!isset($data['name']) || $data['name'] === '') return '';
11740868f2fSAdrian Lang
11840868f2fSAdrian Lang    $name = $data['name'];
11940868f2fSAdrian Lang    unset($data['name']);
12040868f2fSAdrian Lang
121905fa971SAdrian Lang    $secid = $data['secid'];
122905fa971SAdrian Lang    unset($data['secid']);
123905fa971SAdrian Lang
124*7afe5d93SSatoshi Sahara    $params = array_merge(
125*7afe5d93SSatoshi Sahara           array('do'  => 'edit', 'rev' => $INFO['lastmod'], 'summary' => '['.$name.'] '),
126*7afe5d93SSatoshi Sahara           $data
127*7afe5d93SSatoshi Sahara    );
128*7afe5d93SSatoshi Sahara
129*7afe5d93SSatoshi Sahara    $html = '<div class="secedit editbutton_'.$data['target'] .' editbutton_'.$secid .'">';
130*7afe5d93SSatoshi Sahara    $html.= html_btn('secedit', $ID, '', $params, 'post', $name);
131*7afe5d93SSatoshi Sahara    $html.= '</div>';
132*7afe5d93SSatoshi Sahara    return $html;
133f3f0262cSandi}
134f3f0262cSandi
135f3f0262cSandi/**
136d6c9c552Smatthiasgrimm * Just the back to top button (in its own form)
1376b13307fSandi *
1386b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
13942ea7f44SGerrit Uitslag *
14042ea7f44SGerrit Uitslag * @return string html
1416b13307fSandi */
1426b13307fSandifunction html_topbtn() {
1436b13307fSandi    global $lang;
1446b13307fSandi
145*7afe5d93SSatoshi Sahara    $html = '<a class="nolink" href="#dokuwiki__top">'
146*7afe5d93SSatoshi Sahara        .'<button class="button" onclick="window.scrollTo(0, 0)" title="'. $lang['btn_top'] .'">'
147*7afe5d93SSatoshi Sahara        . $lang['btn_top']
148*7afe5d93SSatoshi Sahara        .'</button></a>';
149*7afe5d93SSatoshi Sahara    return $html;
1506b13307fSandi}
1516b13307fSandi
1526b13307fSandi/**
153d67ca2c0Smatthiasgrimm * Displays a button (using its own form)
15435dae8b0SBen Coburn * If tooltip exists, the access key tooltip is replaced.
15515fae107Sandi *
15615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
15742ea7f44SGerrit Uitslag *
15842ea7f44SGerrit Uitslag * @param string         $name
15942ea7f44SGerrit Uitslag * @param string         $id
16042ea7f44SGerrit Uitslag * @param string         $akey   access key
161e3710957SGerrit Uitslag * @param string[] $params key-value pairs added as hidden inputs
16242ea7f44SGerrit Uitslag * @param string         $method
16342ea7f44SGerrit Uitslag * @param string         $tooltip
16442ea7f44SGerrit Uitslag * @param bool|string    $label  label text, false: lookup btn_$name in localization
165e824d633SMichael Große * @param string         $svg (optional) svg code, inserted into the button
16642ea7f44SGerrit Uitslag * @return string
167f3f0262cSandi */
168e824d633SMichael Großefunction html_btn($name, $id, $akey, $params, $method = 'get', $tooltip = '', $label = false, $svg = null) {
169f3f0262cSandi    global $conf;
170f3f0262cSandi    global $lang;
171f3f0262cSandi
172f5baf821SAnika Henke    if (!$label)
173f3f0262cSandi        $label = $lang['btn_'.$name];
174f3f0262cSandi
17549c713a3Sandi    //filter id (without urlencoding)
17649c713a3Sandi    $id = idfilter($id,false);
177f3f0262cSandi
178f3f0262cSandi    //make nice URLs even for buttons
1796c7843b5Sandi    if ($conf['userewrite'] == 2) {
1806c7843b5Sandi        $script = DOKU_BASE.DOKU_SCRIPT.'/'.$id;
1816c7843b5Sandi    } elseif ($conf['userewrite']) {
1826c7843b5Sandi        $script = DOKU_BASE.$id;
1836c7843b5Sandi    } else {
1848b00ebcfSandi        $script = DOKU_BASE.DOKU_SCRIPT;
185f3f0262cSandi        $params['id'] = $id;
186f3f0262cSandi    }
187f3f0262cSandi
188*7afe5d93SSatoshi Sahara    $html = '<form class="button btn_'.$name.'" method="'.$method.'" action="'.$script.'"><div class="no">';
189f3f0262cSandi
19006a4bf8fSAndreas Gohr    if (is_array($params)) {
1919e491c01SAndreas Gohr        foreach ($params as $key => $val) {
192*7afe5d93SSatoshi Sahara            $html .= '<input type="hidden" name="'.$key.'" value="'.hsc($val).'" />';
193f3f0262cSandi        }
19406a4bf8fSAndreas Gohr    }
195f3f0262cSandi
196*7afe5d93SSatoshi Sahara    $tip = empty($tooltip) ? hsc($label) : hsc($tooltip);
19711ea018fSAndreas Gohr
198*7afe5d93SSatoshi Sahara    $html .= '<button type="submit" ';
19911ea018fSAndreas Gohr    if ($akey) {
20007493d05SAnika Henke        $tip  .= ' ['.strtoupper($akey).']';
201*7afe5d93SSatoshi Sahara        $html .= 'accesskey="'.$akey.'" ';
20235dae8b0SBen Coburn    }
203*7afe5d93SSatoshi Sahara    $html .= 'title="'.$tip.'">';
204e824d633SMichael Große    if ($svg) {
205*7afe5d93SSatoshi Sahara        $html .= '<span>'. hsc($label) .'</span>'. inlineSVG($svg);
206679dba01SMichael Große    } else {
207*7afe5d93SSatoshi Sahara        $html .= hsc($label);
208679dba01SMichael Große    }
209*7afe5d93SSatoshi Sahara    $html .= '</button>';
210*7afe5d93SSatoshi Sahara    $html .= '</div></form>';
211f3f0262cSandi
212*7afe5d93SSatoshi Sahara    return $html;
213f3f0262cSandi}
2140747f5d7Sghi/**
2150747f5d7Sghi * show a revision warning
2160747f5d7Sghi *
2170747f5d7Sghi * @author Szymon Olewniczak <dokuwiki@imz.re>
2180747f5d7Sghi */
219c8556525Sghifunction html_showrev() {
220c8556525Sghi    print p_locale_xhtml('showrev');
2210747f5d7Sghi}
222f3f0262cSandi
223f3f0262cSandi/**
22442ea7f44SGerrit Uitslag * Show a wiki page
22515fae107Sandi *
22615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
22742ea7f44SGerrit Uitslag *
22842ea7f44SGerrit Uitslag * @param null|string $txt wiki text or null for showing $ID
229bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
23015fae107Sandi */
23111c78c94SAndreas Gohrfunction html_show($txt=null) {
232bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\PageView($txt))->show();
233f3f0262cSandi}
234f3f0262cSandi
235f3f0262cSandi/**
236ee4c4a1bSAndreas Gohr * ask the user about how to handle an exisiting draft
237ee4c4a1bSAndreas Gohr *
238ee4c4a1bSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
239bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
240ee4c4a1bSAndreas Gohr */
241ee4c4a1bSAndreas Gohrfunction html_draft() {
242bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Draft)->show();
243ee4c4a1bSAndreas Gohr}
244ee4c4a1bSAndreas Gohr
245ee4c4a1bSAndreas Gohr/**
246f3f0262cSandi * Highlights searchqueries in HTML code
24715fae107Sandi *
24815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
2497209be23SAndreas Gohr * @author Harry Fuecks <hfuecks@gmail.com>
25042ea7f44SGerrit Uitslag *
25142ea7f44SGerrit Uitslag * @param string $html
25242ea7f44SGerrit Uitslag * @param array|string $phrases
25342ea7f44SGerrit Uitslag * @return string html
254f3f0262cSandi */
255546d3a99SAndreas Gohrfunction html_hilight($html, $phrases) {
2568a803caeSAndreas Gohr    $phrases = (array) $phrases;
2578a803caeSAndreas Gohr    $phrases = array_map('preg_quote_cb', $phrases);
2588a803caeSAndreas Gohr    $phrases = array_map('ft_snippet_re_preprocess', $phrases);
2598a803caeSAndreas Gohr    $phrases = array_filter($phrases);
2608a803caeSAndreas Gohr    $regex = join('|',$phrases);
26160c15d7dSAndreas Gohr
26260c15d7dSAndreas Gohr    if ($regex === '') return $html;
2638cbc5ee8SAndreas Gohr    if (!\dokuwiki\Utf8\Clean::isUtf8($regex)) return $html;
264f3f0262cSandi
265675d8ce4SSatoshi Sahara    $html = @preg_replace_callback("/((<[^>]*)|$regex)/ui", function ($match) {
266675d8ce4SSatoshi Sahara        $hlight = unslash($match[0]);
267675d8ce4SSatoshi Sahara        if (!isset($match[2])) {
268688774a0SAnika Henke            $hlight = '<span class="search_hit">'.$hlight.'</span>';
2697209be23SAndreas Gohr        }
2707209be23SAndreas Gohr        return $hlight;
271675d8ce4SSatoshi Sahara    }, $html);
272675d8ce4SSatoshi Sahara    return $html;
2737209be23SAndreas Gohr}
2747209be23SAndreas Gohr
2757209be23SAndreas Gohr/**
27615fae107Sandi * Display error on locked pages
27715fae107Sandi *
27815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
279*7afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Locked::tplContent()
28015fae107Sandi */
281ee20e7d1Sandifunction html_locked() {
282f3f0262cSandi}
283f3f0262cSandi
28415fae107Sandi/**
28515fae107Sandi * list old revisions
28615fae107Sandi *
28715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
28871726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
2898e69fd30SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
290e0c26282SGerrit Uitslag *
291e0c26282SGerrit Uitslag * @param int $first skip the first n changelog lines
292e0c26282SGerrit Uitslag * @param bool|string $media_id id of media, or false for current page
293bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
29415fae107Sandi */
2958e69fd30SKate Arzamastsevafunction html_revisions($first=0, $media_id = false) {
296bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Revisions($first, $media_id))->show();
297f3f0262cSandi}
298f3f0262cSandi
29915fae107Sandi/**
30015fae107Sandi * display recent changes
30115fae107Sandi *
30215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
3035749f1ceSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
30471726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
3058d40b4b6SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
30642ea7f44SGerrit Uitslag *
30742ea7f44SGerrit Uitslag * @param int $first
30842ea7f44SGerrit Uitslag * @param string $show_changes
309bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
31015fae107Sandi */
3110739a638SKate Arzamastsevafunction html_recent($first = 0, $show_changes = 'both') {
312bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Recent($first, $show_changes))->show();
313f3f0262cSandi}
314f3f0262cSandi
31515fae107Sandi/**
31615fae107Sandi * Display page index
31715fae107Sandi *
31815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
31942ea7f44SGerrit Uitslag *
32042ea7f44SGerrit Uitslag * @param string $ns
321bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
32215fae107Sandi */
323f3f0262cSandifunction html_index($ns) {
324bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Index($ns))->show();
325f3f0262cSandi}
326f3f0262cSandi
327f3f0262cSandi/**
32815fae107Sandi * Index item formatter
32915fae107Sandi *
330f3f0262cSandi * User function for html_buildlist()
33115fae107Sandi *
33215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
33342ea7f44SGerrit Uitslag *
33442ea7f44SGerrit Uitslag * @param array $item
33542ea7f44SGerrit Uitslag * @return string
3369c8632b4SSatoshi Sahara * @deprecated 2020-07-18
337f3f0262cSandi */
3389c8632b4SSatoshi Saharafunction html_list_index($item) {
3399c8632b4SSatoshi Sahara    return (new dokuwiki\Ui\Index)->formatListItem($item);
340f3f0262cSandi}
341f3f0262cSandi
342f3f0262cSandi/**
343cb70c441Sandi * Index List item
344cb70c441Sandi *
345a1dee2b9SAdrian Lang * This user function is used in html_buildlist to build the
346cb70c441Sandi * <li> tags for namespaces when displaying the page index
347cb70c441Sandi * it gives different classes to opened or closed "folders"
348cb70c441Sandi *
349cb70c441Sandi * @author Andreas Gohr <andi@splitbrain.org>
35042ea7f44SGerrit Uitslag *
35142ea7f44SGerrit Uitslag * @param array $item
35242ea7f44SGerrit Uitslag * @return string html
3539c8632b4SSatoshi Sahara * @deprecated 2020-07-18
354cb70c441Sandi */
3559c8632b4SSatoshi Saharafunction html_li_index($item) {
3569c8632b4SSatoshi Sahara    return (new dokuwiki\Ui\Index)->tagListItem($item);
357cb70c441Sandi}
358cb70c441Sandi
359cb70c441Sandi/**
36015fae107Sandi * Build an unordered list
36115fae107Sandi *
362f3f0262cSandi * Build an unordered list from the given $data array
363f3f0262cSandi * Each item in the array has to have a 'level' property
364f3f0262cSandi * the item itself gets printed by the given $func user
365cb70c441Sandi * function. The second and optional function is used to
366cb70c441Sandi * print the <li> tag. Both user function need to accept
367cb70c441Sandi * a single item.
36815fae107Sandi *
369c5a8fd96SAndreas Gohr * Both user functions can be given as array to point to
370c5a8fd96SAndreas Gohr * a member of an object.
371c5a8fd96SAndreas Gohr *
37215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
37380679bafSGerrit Uitslag *
37480679bafSGerrit Uitslag * @param array    $data  array with item arrays
37580679bafSGerrit Uitslag * @param string   $class class of ul wrapper
37680679bafSGerrit Uitslag * @param callable $func  callback to print an list item
377bde560b4SSatoshi Sahara * @param callable $lifunc (optional) callback to the opening li tag
378bde560b4SSatoshi Sahara * @param bool     $forcewrapper (optional) Trigger building a wrapper ul if the first level is
379ae614416SAnika Henke *                               0 (we have a root object) or 1 (just the root content)
38080679bafSGerrit Uitslag * @return string html of an unordered list
381f3f0262cSandi */
382bde560b4SSatoshi Saharafunction html_buildlist($data, $class, $func, $lifunc = null, $forcewrapper = false) {
383a1dee2b9SAdrian Lang    if (count($data) === 0) {
384a1dee2b9SAdrian Lang        return '';
385a1dee2b9SAdrian Lang    }
386a1dee2b9SAdrian Lang
3872689c55fSMichael Große    $firstElement = reset($data);
3882689c55fSMichael Große    $start_level = $firstElement['level'];
3899e4f7880SAdrian Lang    $level = $start_level;
3909c8632b4SSatoshi Sahara    $html  = '';
391434f5921SHakan Sandell    $open  = 0;
3929e4f7880SAdrian Lang
393bde560b4SSatoshi Sahara    // set callback function to build the <li> tag, formerly defined as html_li_default()
394bde560b4SSatoshi Sahara    if (!is_callable($lifunc)) {
3959c8632b4SSatoshi Sahara       $lifunc = function ($item) {
3969c8632b4SSatoshi Sahara           return '<li class="level'.$item['level'].'">';
3979c8632b4SSatoshi Sahara       };
398bde560b4SSatoshi Sahara    }
399bde560b4SSatoshi Sahara
400f3f0262cSandi    foreach ($data as $item) {
401f3f0262cSandi        if ($item['level'] > $level) {
402f3f0262cSandi            //open new list
403df52d0feSandi            for ($i = 0; $i < ($item['level'] - $level); $i++) {
4049c8632b4SSatoshi Sahara                if ($i) $html .= '<li class="clear">';
4059c8632b4SSatoshi Sahara                $html .= "\n".'<ul class="'.$class.'">'."\n";
406434f5921SHakan Sandell                $open++;
407df52d0feSandi            }
408434f5921SHakan Sandell            $level = $item['level'];
409434f5921SHakan Sandell
410f3f0262cSandi        } elseif ($item['level'] < $level) {
411f3f0262cSandi            //close last item
4129c8632b4SSatoshi Sahara            $html .= '</li>'."\n";
413434f5921SHakan Sandell            while ($level > $item['level'] && $open > 0 ) {
414f3f0262cSandi                //close higher lists
4159c8632b4SSatoshi Sahara                $html .= '</ul>'."\n".'</li>'."\n";
416434f5921SHakan Sandell                $level--;
417434f5921SHakan Sandell                $open--;
418f3f0262cSandi            }
4199c8632b4SSatoshi Sahara        } elseif ($html !== '') {
42087671313SHakan Sandell            //close previous item
4219c8632b4SSatoshi Sahara            $html .= '</li>'."\n";
422f3f0262cSandi        }
423f3f0262cSandi
424f3f0262cSandi        //print item
4259c8632b4SSatoshi Sahara        $html .= call_user_func($lifunc, $item);
4269c8632b4SSatoshi Sahara        $html .= '<div class="li">';
42734dbe711Schris
4289c8632b4SSatoshi Sahara        $html .= call_user_func($func, $item);
4299c8632b4SSatoshi Sahara        $html .= '</div>';
430f3f0262cSandi    }
431f3f0262cSandi
432f3f0262cSandi    //close remaining items and lists
4339c8632b4SSatoshi Sahara    $html .= '</li>'."\n";
434434f5921SHakan Sandell    while ($open-- > 0) {
4359c8632b4SSatoshi Sahara        $html .= '</ul></li>'."\n";
436434f5921SHakan Sandell    }
437434f5921SHakan Sandell
438434f5921SHakan Sandell    if ($forcewrapper || $start_level < 2) {
439434f5921SHakan Sandell        // Trigger building a wrapper ul if the first level is
440434f5921SHakan Sandell        // 0 (we have a root object) or 1 (just the root content)
4419c8632b4SSatoshi Sahara        $html = "\n".'<ul class="'.$class.'">'."\n".$html.'</ul>'."\n";
442f3f0262cSandi    }
443f3f0262cSandi
4449c8632b4SSatoshi Sahara    return $html;
445f3f0262cSandi}
446f3f0262cSandi
44715fae107Sandi/**
44815fae107Sandi * display backlinks
44915fae107Sandi *
45015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
45111df47ecSMichael Klier * @author Michael Klier <chi@chimeric.de>
452bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
45315fae107Sandi */
454f3f0262cSandifunction html_backlinks() {
455bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Backlinks)->show();
45695b451bcSAdrian Lang}
45795b451bcSAdrian Lang
45815fae107Sandi/**
45904e99fe1SGerrit Uitslag * Show diff
460baf0c3e5SGerrit Uitslag * between current page version and provided $text
461baf0c3e5SGerrit Uitslag * or between the revisions provided via GET or POST
46215fae107Sandi *
46315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
464baf0c3e5SGerrit Uitslag * @param  string $text  when non-empty: compare with this text with most current version
46504e99fe1SGerrit Uitslag * @param  bool   $intro display the intro text
4668d5e837eSMichael Hamann * @param  string $type  type of the diff (inline or sidebyside)
467bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
46815fae107Sandi */
46972165381SAndreas Gohrfunction html_diff($text = '', $intro = true, $type = null) {
470bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Diff($text, $intro, $type))->show();
471fcfecb69SChristopher Smith}
472fcfecb69SChristopher Smith
47315fae107Sandi/**
47415fae107Sandi * show warning on conflict detection
47515fae107Sandi *
47615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
47742ea7f44SGerrit Uitslag *
47842ea7f44SGerrit Uitslag * @param string $text
47942ea7f44SGerrit Uitslag * @param string $summary
480bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
48115fae107Sandi */
482f3f0262cSandifunction html_conflict($text, $summary) {
483bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Conflict($text, $summary))->show();
484f3f0262cSandi}
485f3f0262cSandi
486f3f0262cSandi/**
48715fae107Sandi * Prints the global message array
48815fae107Sandi *
48915fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
490f3f0262cSandi */
491f3f0262cSandifunction html_msgarea() {
492cc58224cSMichael Hamann    global $MSG, $MSG_shown;
4938d5e837eSMichael Hamann    /** @var array $MSG */
494cc58224cSMichael Hamann    // store if the global $MSG has already been shown and thus HTML output has been started
495cc58224cSMichael Hamann    $MSG_shown = true;
496cc58224cSMichael Hamann
497f3f0262cSandi    if (!isset($MSG)) return;
498f3f0262cSandi
4994af9f0d4SAndreas Gohr    $shown = array();
500f3f0262cSandi    foreach ($MSG as $msg) {
5014af9f0d4SAndreas Gohr        $hash = md5($msg['msg']);
5024af9f0d4SAndreas Gohr        if (isset($shown[$hash])) continue; // skip double messages
503f755f9abSChristopher Smith        if (info_msg_allowed($msg)) {
504f3f0262cSandi            print '<div class="'.$msg['lvl'].'">';
505f3f0262cSandi            print $msg['msg'];
506f3f0262cSandi            print '</div>';
507d3bae478SChristopher Smith        }
5084af9f0d4SAndreas Gohr        $shown[$hash] = 1;
509f3f0262cSandi    }
510cc58224cSMichael Hamann
511cc58224cSMichael Hamann    unset($GLOBALS['MSG']);
512f3f0262cSandi}
513f3f0262cSandi
514f3f0262cSandi/**
515f3f0262cSandi * Prints the registration form
51615fae107Sandi *
51715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
518bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
519f3f0262cSandi */
520f3f0262cSandifunction html_register() {
521bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\UserRegister)->show();
522f3f0262cSandi}
523f3f0262cSandi
524f3f0262cSandi/**
5258b06d178Schris * Print the update profile form
5268b06d178Schris *
5278b06d178Schris * @author Christopher Smith <chris@jalakai.co.uk>
5288b06d178Schris * @author Andreas Gohr <andi@splitbrain.org>
529bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
5308b06d178Schris */
5318b06d178Schrisfunction html_updateprofile() {
532bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\UserProfile)->show();
5338b06d178Schris}
5348b06d178Schris
5358b06d178Schris/**
5367c4635c4SAdrian Lang * Preprocess edit form data
53715fae107Sandi *
53815fae107Sandi * @author   Andreas Gohr <andi@splitbrain.org>
5392ffea8f2SAdrian Lang *
5402ffea8f2SAdrian Lang * @triggers HTML_EDITFORM_OUTPUT
541bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
542f3f0262cSandi */
5435a932e77SAdrian Langfunction html_edit() {
544bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Editor)->show();
545b6912aeaSAndreas Gohr}
546b6912aeaSAndreas Gohr
547b6912aeaSAndreas Gohr/**
548f3f0262cSandi * prints some debug info
54915fae107Sandi *
55015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
551f3f0262cSandi */
552f3f0262cSandifunction html_debug() {
553f3f0262cSandi    global $conf;
554d16a4edaSandi    global $lang;
555e1d9dcc8SAndreas Gohr    /** @var AuthPlugin $auth */
5565298a619SAndreas Gohr    global $auth;
557100a97e3SAndreas Gohr    global $INFO;
558100a97e3SAndreas Gohr
55928fb55ffSandi    //remove sensitive data
56028fb55ffSandi    $cnf = $conf;
56124297a69SAndreas Gohr    debug_guard($cnf);
562100a97e3SAndreas Gohr    $nfo = $INFO;
56324297a69SAndreas Gohr    debug_guard($nfo);
564100a97e3SAndreas Gohr    $ses = $_SESSION;
56524297a69SAndreas Gohr    debug_guard($ses);
566f3f0262cSandi
567f3f0262cSandi    print '<html><body>';
568f3f0262cSandi
569f3f0262cSandi    print '<p>When reporting bugs please send all the following ';
570f3f0262cSandi    print 'output as a mail to andi@splitbrain.org ';
571f3f0262cSandi    print 'The best way to do this is to save this page in your browser</p>';
572f3f0262cSandi
573100a97e3SAndreas Gohr    print '<b>$INFO:</b><pre>';
574100a97e3SAndreas Gohr    print_r($nfo);
575100a97e3SAndreas Gohr    print '</pre>';
576100a97e3SAndreas Gohr
577f3f0262cSandi    print '<b>$_SERVER:</b><pre>';
578f3f0262cSandi    print_r($_SERVER);
579f3f0262cSandi    print '</pre>';
580f3f0262cSandi
581f3f0262cSandi    print '<b>$conf:</b><pre>';
58228fb55ffSandi    print_r($cnf);
583f3f0262cSandi    print '</pre>';
584f3f0262cSandi
585ed7b5f09Sandi    print '<b>DOKU_BASE:</b><pre>';
586ed7b5f09Sandi    print DOKU_BASE;
587f3f0262cSandi    print '</pre>';
588f3f0262cSandi
589ed7b5f09Sandi    print '<b>abs DOKU_BASE:</b><pre>';
590ed7b5f09Sandi    print DOKU_URL;
591ed7b5f09Sandi    print '</pre>';
592ed7b5f09Sandi
593ed7b5f09Sandi    print '<b>rel DOKU_BASE:</b><pre>';
594f3f0262cSandi    print dirname($_SERVER['PHP_SELF']).'/';
595f3f0262cSandi    print '</pre>';
596f3f0262cSandi
597f3f0262cSandi    print '<b>PHP Version:</b><pre>';
598f3f0262cSandi    print phpversion();
599f3f0262cSandi    print '</pre>';
600f3f0262cSandi
601f3f0262cSandi    print '<b>locale:</b><pre>';
602f3f0262cSandi    print setlocale(LC_ALL,0);
603f3f0262cSandi    print '</pre>';
604f3f0262cSandi
605d16a4edaSandi    print '<b>encoding:</b><pre>';
606d16a4edaSandi    print $lang['encoding'];
607d16a4edaSandi    print '</pre>';
608d16a4edaSandi
6095298a619SAndreas Gohr    if ($auth) {
6105298a619SAndreas Gohr        print '<b>Auth backend capabilities:</b><pre>';
6112f46ade0SChristopher Smith        foreach ($auth->getCapabilities() as $cando) {
612*7afe5d93SSatoshi Sahara            print '   '.str_pad($cando,16) .' => '. (int)$auth->canDo($cando) . DOKU_LF;
6132f46ade0SChristopher Smith        }
6145298a619SAndreas Gohr        print '</pre>';
6155298a619SAndreas Gohr    }
6165298a619SAndreas Gohr
6173aa54d7cSAndreas Gohr    print '<b>$_SESSION:</b><pre>';
618100a97e3SAndreas Gohr    print_r($ses);
6193aa54d7cSAndreas Gohr    print '</pre>';
6203aa54d7cSAndreas Gohr
621f3f0262cSandi    print '<b>Environment:</b><pre>';
622f3f0262cSandi    print_r($_ENV);
623f3f0262cSandi    print '</pre>';
624f3f0262cSandi
625f3f0262cSandi    print '<b>PHP settings:</b><pre>';
626f3f0262cSandi    $inis = ini_get_all();
627f3f0262cSandi    print_r($inis);
628f3f0262cSandi    print '</pre>';
629f3f0262cSandi
630e89b7c1eSChristopher Smith    if (function_exists('apache_get_version')) {
63159bc3b48SGerrit Uitslag        $apache = array();
632e89b7c1eSChristopher Smith        $apache['version'] = apache_get_version();
633e89b7c1eSChristopher Smith
634e89b7c1eSChristopher Smith        if (function_exists('apache_get_modules')) {
635e89b7c1eSChristopher Smith            $apache['modules'] = apache_get_modules();
636e89b7c1eSChristopher Smith        }
637e89b7c1eSChristopher Smith        print '<b>Apache</b><pre>';
638e89b7c1eSChristopher Smith        print_r($apache);
639e89b7c1eSChristopher Smith        print '</pre>';
640e89b7c1eSChristopher Smith    }
641e89b7c1eSChristopher Smith
642f3f0262cSandi    print '</body></html>';
643f3f0262cSandi}
644f3f0262cSandi
64510271ce4SAndreas Gohr/**
6468b06d178Schris * Form to request a new password for an existing account
6478b06d178Schris *
6488b06d178Schris * @author Benoit Chesneau <benoit@bchesneau.info>
649cc204bbdSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de>
650bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
65111e2ce22Schris */
6528b06d178Schrisfunction html_resendpwd() {
653bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\UserResendPwd)->show();
654cc204bbdSAndreas Gohr}
655cc204bbdSAndreas Gohr
656fdb8d77bSTom N Harris/**
657b8595a66SAndreas Gohr * Return the TOC rendered to XHTML
658b8595a66SAndreas Gohr *
659b8595a66SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
66042ea7f44SGerrit Uitslag *
66142ea7f44SGerrit Uitslag * @param array $toc
66242ea7f44SGerrit Uitslag * @return string html
663b8595a66SAndreas Gohr */
664b8595a66SAndreas Gohrfunction html_TOC($toc) {
665b8595a66SAndreas Gohr    if (!count($toc)) return '';
666b8595a66SAndreas Gohr    global $lang;
667b8595a66SAndreas Gohr    $out  = '<!-- TOC START -->'.DOKU_LF;
668158a5bffSDeathCamel57    $out .= '<div id="dw__toc" class="dw__toc">'.DOKU_LF;
66948722ac8SAnika Henke    $out .= '<h3 class="toggle">';
670b8595a66SAndreas Gohr    $out .= $lang['toc'];
671d5acc30dSAnika Henke    $out .= '</h3>'.DOKU_LF;
672d5acc30dSAnika Henke    $out .= '<div>'.DOKU_LF;
673bde560b4SSatoshi Sahara    $out .= html_buildlist($toc, 'toc', 'html_list_toc', null, true);
674b8595a66SAndreas Gohr    $out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF;
675b8595a66SAndreas Gohr    $out .= '<!-- TOC END -->'.DOKU_LF;
676db959ae3SAndreas Gohr    return $out;
677db959ae3SAndreas Gohr}
678b8595a66SAndreas Gohr
679b8595a66SAndreas Gohr/**
680b8595a66SAndreas Gohr * Callback for html_buildlist
68142ea7f44SGerrit Uitslag *
68242ea7f44SGerrit Uitslag * @param array $item
68342ea7f44SGerrit Uitslag * @return string html
684b8595a66SAndreas Gohr */
685b8595a66SAndreas Gohrfunction html_list_toc($item) {
686c66972f2SAdrian Lang    if (isset($item['hid'])){
6877d91652aSAndreas Gohr        $link = '#'.$item['hid'];
6887d91652aSAndreas Gohr    } else {
6897d91652aSAndreas Gohr        $link = $item['link'];
6907d91652aSAndreas Gohr    }
6917d91652aSAndreas Gohr
692d5acc30dSAnika Henke    return '<a href="'.$link.'">'.hsc($item['title']).'</a>';
693b8595a66SAndreas Gohr}
694b8595a66SAndreas Gohr
695b8595a66SAndreas Gohr/**
696b8595a66SAndreas Gohr * Helper function to build TOC items
697b8595a66SAndreas Gohr *
698b8595a66SAndreas Gohr * Returns an array ready to be added to a TOC array
699b8595a66SAndreas Gohr *
700b8595a66SAndreas Gohr * @param string $link  - where to link (if $hash set to '#' it's a local anchor)
701b8595a66SAndreas Gohr * @param string $text  - what to display in the TOC
702b8595a66SAndreas Gohr * @param int    $level - nesting level
703b8595a66SAndreas Gohr * @param string $hash  - is prepended to the given $link, set blank if you want full links
7048d5e837eSMichael Hamann * @return array the toc item
705b8595a66SAndreas Gohr */
706b8595a66SAndreas Gohrfunction html_mktocitem($link, $text, $level, $hash='#') {
707bde560b4SSatoshi Sahara    return  array(
708bde560b4SSatoshi Sahara            'link'  => $hash.$link,
709b8595a66SAndreas Gohr            'title' => $text,
710b8595a66SAndreas Gohr            'type'  => 'ul',
711bde560b4SSatoshi Sahara            'level' => $level
712bde560b4SSatoshi Sahara    );
713b8595a66SAndreas Gohr}
714b8595a66SAndreas Gohr
715b8595a66SAndreas Gohr/**
716fdb8d77bSTom N Harris * Output a Doku_Form object.
717fdb8d77bSTom N Harris * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT
718fdb8d77bSTom N Harris *
719fdb8d77bSTom N Harris * @author Tom N Harris <tnharris@whoopdedo.org>
72042ea7f44SGerrit Uitslag *
7218d5e837eSMichael Hamann * @param string     $name The name of the form
7228d5e837eSMichael Hamann * @param Doku_Form  $form The form
723fdb8d77bSTom N Harris */
724c29600d0SSatoshi Saharafunction html_form($name, $form) {
725fdb8d77bSTom N Harris    // Safety check in case the caller forgets.
726fdb8d77bSTom N Harris    $form->endFieldset();
727cbb44eabSAndreas Gohr    Event::createAndTrigger('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false);
728fdb8d77bSTom N Harris}
729fdb8d77bSTom N Harris
730fdb8d77bSTom N Harris/**
731fdb8d77bSTom N Harris * Form print function.
732c29600d0SSatoshi Sahara * Just calls printForm() on the form object.
73342ea7f44SGerrit Uitslag *
734c29600d0SSatoshi Sahara * @param Doku_Form $form The form
735fdb8d77bSTom N Harris */
73625dd2a2fSSatoshi Saharafunction html_form_output($form) {
73725dd2a2fSSatoshi Sahara    $form->printForm();
73825dd2a2fSSatoshi Sahara}
739340756e4Sandi
74007bf32b2SAndreas Gohr/**
74107bf32b2SAndreas Gohr * Embed a flash object in HTML
74207bf32b2SAndreas Gohr *
74307bf32b2SAndreas Gohr * This will create the needed HTML to embed a flash movie in a cross browser
74407bf32b2SAndreas Gohr * compatble way using valid XHTML
74507bf32b2SAndreas Gohr *
74607bf32b2SAndreas Gohr * The parameters $params, $flashvars and $atts need to be associative arrays.
74707bf32b2SAndreas Gohr * No escaping needs to be done for them. The alternative content *has* to be
74807bf32b2SAndreas Gohr * escaped because it is used as is. If no alternative content is given
74907bf32b2SAndreas Gohr * $lang['noflash'] is used.
75007bf32b2SAndreas Gohr *
75107bf32b2SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
75207bf32b2SAndreas Gohr * @link   http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml
75307bf32b2SAndreas Gohr *
75407bf32b2SAndreas Gohr * @param string $swf      - the SWF movie to embed
75507bf32b2SAndreas Gohr * @param int $width       - width of the flash movie in pixels
75607bf32b2SAndreas Gohr * @param int $height      - height of the flash movie in pixels
75707bf32b2SAndreas Gohr * @param array $params    - additional parameters (<param>)
75807bf32b2SAndreas Gohr * @param array $flashvars - parameters to be passed in the flashvar parameter
75907bf32b2SAndreas Gohr * @param array $atts      - additional attributes for the <object> tag
76007bf32b2SAndreas Gohr * @param string $alt      - alternative content (is NOT automatically escaped!)
761b3d1090eSMichael Hamann * @return string         - the XHTML markup
76207bf32b2SAndreas Gohr */
76307bf32b2SAndreas Gohrfunction html_flashobject($swf,$width,$height,$params=null,$flashvars=null,$atts=null,$alt=''){
76407bf32b2SAndreas Gohr    global $lang;
76507bf32b2SAndreas Gohr
76607bf32b2SAndreas Gohr    $out = '';
76707bf32b2SAndreas Gohr
76807bf32b2SAndreas Gohr    // prepare the object attributes
76907bf32b2SAndreas Gohr    if(is_null($atts)) $atts = array();
77007bf32b2SAndreas Gohr    $atts['width']  = (int) $width;
771d4c61e61SAndreas Gohr    $atts['height'] = (int) $height;
77207bf32b2SAndreas Gohr    if(!$atts['width'])  $atts['width']  = 425;
77307bf32b2SAndreas Gohr    if(!$atts['height']) $atts['height'] = 350;
77407bf32b2SAndreas Gohr
77507bf32b2SAndreas Gohr    // add object attributes for standard compliant browsers
77607bf32b2SAndreas Gohr    $std = $atts;
77707bf32b2SAndreas Gohr    $std['type'] = 'application/x-shockwave-flash';
77807bf32b2SAndreas Gohr    $std['data'] = $swf;
77907bf32b2SAndreas Gohr
78007bf32b2SAndreas Gohr    // add object attributes for IE
78107bf32b2SAndreas Gohr    $ie  = $atts;
78207bf32b2SAndreas Gohr    $ie['classid'] = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
78307bf32b2SAndreas Gohr
78407bf32b2SAndreas Gohr    // open object (with conditional comments)
78507bf32b2SAndreas Gohr    $out .= '<!--[if !IE]> -->'.NL;
78607bf32b2SAndreas Gohr    $out .= '<object '.buildAttributes($std).'>'.NL;
78707bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->'.NL;
78807bf32b2SAndreas Gohr    $out .= '<!--[if IE]>'.NL;
78907bf32b2SAndreas Gohr    $out .= '<object '.buildAttributes($ie).'>'.NL;
79007bf32b2SAndreas Gohr    $out .= '    <param name="movie" value="'.hsc($swf).'" />'.NL;
7919ae41cdcSAndreas Gohr    $out .= '<!--><!-- -->'.NL;
79207bf32b2SAndreas Gohr
79307bf32b2SAndreas Gohr    // print params
79407bf32b2SAndreas Gohr    if(is_array($params)) foreach($params as $key => $val){
79507bf32b2SAndreas Gohr        $out .= '  <param name="'.hsc($key).'" value="'.hsc($val).'" />'.NL;
79607bf32b2SAndreas Gohr    }
79707bf32b2SAndreas Gohr
79807bf32b2SAndreas Gohr    // add flashvars
79907bf32b2SAndreas Gohr    if(is_array($flashvars)){
800d4c61e61SAndreas Gohr        $out .= '  <param name="FlashVars" value="'.buildURLparams($flashvars).'" />'.NL;
80107bf32b2SAndreas Gohr    }
80207bf32b2SAndreas Gohr
80307bf32b2SAndreas Gohr    // alternative content
80407bf32b2SAndreas Gohr    if($alt){
80507bf32b2SAndreas Gohr        $out .= $alt.NL;
80607bf32b2SAndreas Gohr    }else{
80707bf32b2SAndreas Gohr        $out .= $lang['noflash'].NL;
80807bf32b2SAndreas Gohr    }
80907bf32b2SAndreas Gohr
81007bf32b2SAndreas Gohr    // finish
81107bf32b2SAndreas Gohr    $out .= '</object>'.NL;
81207bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->'.NL;
81307bf32b2SAndreas Gohr
81407bf32b2SAndreas Gohr    return $out;
81507bf32b2SAndreas Gohr}
81607bf32b2SAndreas Gohr
8178d5e837eSMichael Hamann/**
8188d5e837eSMichael Hamann * Prints HTML code for the given tab structure
8198d5e837eSMichael Hamann *
8208d5e837eSMichael Hamann * @param array  $tabs        tab structure
8218d5e837eSMichael Hamann * @param string $current_tab the current tab id
8228d5e837eSMichael Hamann */
82395b451bcSAdrian Langfunction html_tabs($tabs, $current_tab = null) {
82494add303SAnika Henke    echo '<ul class="tabs">'.NL;
82595b451bcSAdrian Lang
82695b451bcSAdrian Lang    foreach ($tabs as $id => $tab) {
82795b451bcSAdrian Lang        html_tab($tab['href'], $tab['caption'], $id === $current_tab);
82895b451bcSAdrian Lang    }
82995b451bcSAdrian Lang
83094add303SAnika Henke    echo '</ul>'.NL;
83195b451bcSAdrian Lang}
832cd2a4cfdSAnika Henke
83395b451bcSAdrian Lang/**
83495b451bcSAdrian Lang * Prints a single tab
83595b451bcSAdrian Lang *
83695b451bcSAdrian Lang * @author Kate Arzamastseva <pshns@ukr.net>
83795b451bcSAdrian Lang * @author Adrian Lang <mail@adrianlang.de>
83895b451bcSAdrian Lang *
83995b451bcSAdrian Lang * @param string $href - tab href
84095b451bcSAdrian Lang * @param string $caption - tab caption
84195b451bcSAdrian Lang * @param boolean $selected - is tab selected
84295b451bcSAdrian Lang */
84395b451bcSAdrian Lang
84495b451bcSAdrian Langfunction html_tab($href, $caption, $selected = false) {
84595b451bcSAdrian Lang    $tab = '<li>';
84695b451bcSAdrian Lang    if ($selected) {
84795b451bcSAdrian Lang        $tab .= '<strong>';
84895b451bcSAdrian Lang    } else {
84995b451bcSAdrian Lang        $tab .= '<a href="' . hsc($href) . '">';
85095b451bcSAdrian Lang    }
85195b451bcSAdrian Lang    $tab .= hsc($caption)
85295b451bcSAdrian Lang         .  '</' . ($selected ? 'strong' : 'a') . '>'
85394add303SAnika Henke         .  '</li>'.NL;
85495b451bcSAdrian Lang    echo $tab;
85595b451bcSAdrian Lang}
85695b451bcSAdrian Lang
857cd2a4cfdSAnika Henke/**
858cd2a4cfdSAnika Henke * Display size change
859cd2a4cfdSAnika Henke *
860cd2a4cfdSAnika Henke * @param int $sizechange - size of change in Bytes
861e34d6962SSatoshi Sahara * @param Doku_Form $form - (optional) form to add elements to
862e34d6962SSatoshi Sahara * @return void|string
863cd2a4cfdSAnika Henke */
864e34d6962SSatoshi Saharafunction html_sizechange($sizechange, $form = null) {
865cd2a4cfdSAnika Henke    if (isset($sizechange)) {
866cd2a4cfdSAnika Henke        $class = 'sizechange';
867cd2a4cfdSAnika Henke        $value = filesize_h(abs($sizechange));
868cd2a4cfdSAnika Henke        if ($sizechange > 0) {
869cd2a4cfdSAnika Henke            $class .= ' positive';
870cd2a4cfdSAnika Henke            $value = '+' . $value;
871cd2a4cfdSAnika Henke        } elseif ($sizechange < 0) {
872cd2a4cfdSAnika Henke            $class .= ' negative';
873cd2a4cfdSAnika Henke            $value = '-' . $value;
8740b78a6edSAnika Henke        } else {
8750b78a6edSAnika Henke            $value = '±' . $value;
876cd2a4cfdSAnika Henke        }
877e34d6962SSatoshi Sahara        if (!isset($form)) {
878e34d6962SSatoshi Sahara            return '<span class="'.$class.'">'.$value.'</span>';
879b0f23f4eSSatoshi Sahara        } else { // Doku_Form
880cd2a4cfdSAnika Henke            $form->addElement(form_makeOpenTag('span', array('class' => $class)));
881cd2a4cfdSAnika Henke            $form->addElement($value);
882cd2a4cfdSAnika Henke            $form->addElement(form_makeCloseTag('span'));
883cd2a4cfdSAnika Henke        }
884cd2a4cfdSAnika Henke    }
885b0f23f4eSSatoshi Sahara}
886