xref: /dokuwiki/inc/html.php (revision 79a2d7845d5e5e48fe3be8f192717de9294aaba5)
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
9*79a2d784SGerrit Uitslaguse dokuwiki\Action\Denied;
10*79a2d784SGerrit Uitslaguse dokuwiki\Action\Locked;
110c3a5702SAndreas Gohruse dokuwiki\ChangeLog\PageChangeLog;
12e1d9dcc8SAndreas Gohruse dokuwiki\Extension\AuthPlugin;
13cbb44eabSAndreas Gohruse dokuwiki\Extension\Event;
14*79a2d784SGerrit Uitslaguse dokuwiki\Ui\Backlinks;
15*79a2d784SGerrit Uitslaguse dokuwiki\Ui\Editor;
16*79a2d784SGerrit Uitslaguse dokuwiki\Ui\Index;
17*79a2d784SGerrit Uitslaguse dokuwiki\Ui\Login;
18*79a2d784SGerrit Uitslaguse dokuwiki\Ui\PageConflict;
19*79a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDiff;
20*79a2d784SGerrit Uitslaguse dokuwiki\Ui\PageDraft;
21*79a2d784SGerrit Uitslaguse dokuwiki\Ui\PageRevisions;
22*79a2d784SGerrit Uitslaguse dokuwiki\Ui\PageView;
23*79a2d784SGerrit Uitslaguse dokuwiki\Ui\Recent;
24*79a2d784SGerrit Uitslaguse dokuwiki\Ui\UserProfile;
25*79a2d784SGerrit Uitslaguse dokuwiki\Ui\UserRegister;
26*79a2d784SGerrit Uitslaguse dokuwiki\Ui\UserResendPwd;
27*79a2d784SGerrit Uitslaguse dokuwiki\Utf8\Clean;
280c3a5702SAndreas Gohr
292d3b082eSMichael Großeif (!defined('SEC_EDIT_PATTERN')) {
3037c80e0eSLarsDW223    define('SEC_EDIT_PATTERN', '#<!-- EDIT({.*?}) -->#');
312d3b082eSMichael Große}
322d3b082eSMichael Große
336bbae538Sandi
34f3f0262cSandi/**
35f3f0262cSandi * Convenience function to quickly build a wikilink
3615fae107Sandi *
3715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
388d5e837eSMichael Hamann * @param string  $id      id of the target page
398d5e837eSMichael Hamann * @param string  $name    the name of the link, i.e. the text that is displayed
408d5e837eSMichael Hamann * @param string|array  $search  search string(s) that shall be highlighted in the target page
418d5e837eSMichael Hamann * @return string the HTML code of the link
42f3f0262cSandi */
43db959ae3SAndreas Gohrfunction html_wikilink($id, $name = null, $search = '') {
44a8397511SGerrit Uitslag    /** @var Doku_Renderer_xhtml $xhtml_renderer */
45db959ae3SAndreas Gohr    static $xhtml_renderer = null;
46723d78dbSandi    if (is_null($xhtml_renderer)) {
477aea91afSChris Smith        $xhtml_renderer = p_get_renderer('xhtml');
48f3f0262cSandi    }
49f3f0262cSandi
50fe9ec250SChris Smith    return $xhtml_renderer->internallink($id,$name,$search,true,'navigation');
51f3f0262cSandi}
52f3f0262cSandi
53f3f0262cSandi/**
54f3f0262cSandi * The loginform
5515fae107Sandi *
5615fae107Sandi * @author   Andreas Gohr <andi@splitbrain.org>
57d1d904bbSMichael Große *
58d1d904bbSMichael Große * @param bool $svg Whether to show svg icons in the register and resendpwd links or not
59bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
60f3f0262cSandi */
61d1d904bbSMichael Großefunction html_login($svg = false) {
62*79a2d784SGerrit Uitslag    dbg_deprecated(Login::class .'::show()');
63bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Login($svg))->show();
64f3f0262cSandi}
65f3f0262cSandi
66d59dea9fSGerrit Uitslag
67d59dea9fSGerrit Uitslag/**
68d59dea9fSGerrit Uitslag * Denied page content
69d59dea9fSGerrit Uitslag *
707afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Denied::tplContent()
71d59dea9fSGerrit Uitslag */
72d59dea9fSGerrit Uitslagfunction html_denied() {
73*79a2d784SGerrit Uitslag    dbg_deprecated(Denied::class .'::showBanner()');
74a215faf2SSatoshi Sahara    (new dokuwiki\Action\Denied())->showBanner();
75d59dea9fSGerrit Uitslag}
76d59dea9fSGerrit Uitslag
77f3f0262cSandi/**
7815fae107Sandi * inserts section edit buttons if wanted or removes the markers
7915fae107Sandi *
8015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
8142ea7f44SGerrit Uitslag *
8242ea7f44SGerrit Uitslag * @param string $text
8342ea7f44SGerrit Uitslag * @param bool   $show show section edit buttons?
8442ea7f44SGerrit Uitslag * @return string
8515fae107Sandi */
86f3f0262cSandifunction html_secedit($text, $show = true) {
87f3f0262cSandi    global $INFO;
8835dae8b0SBen Coburn
89aac83cd4SPhy    if ((isset($INFO) && !$INFO['writable']) || !$show || (isset($INFO) && $INFO['rev'])) {
902d3b082eSMichael Große        return preg_replace(SEC_EDIT_PATTERN,'',$text);
91f3f0262cSandi    }
9235dae8b0SBen Coburn
932d3b082eSMichael Große    return preg_replace_callback(SEC_EDIT_PATTERN,
9440868f2fSAdrian Lang                'html_secedit_button', $text);
9540868f2fSAdrian Lang}
9640868f2fSAdrian Lang
9740868f2fSAdrian Lang/**
9840868f2fSAdrian Lang * prepares section edit button data for event triggering
9940868f2fSAdrian Lang * used as a callback in html_secedit
10040868f2fSAdrian Lang *
10140868f2fSAdrian Lang * @author Andreas Gohr <andi@splitbrain.org>
10242ea7f44SGerrit Uitslag *
10342ea7f44SGerrit Uitslag * @param array $matches matches with regexp
10442ea7f44SGerrit Uitslag * @return string
10542ea7f44SGerrit Uitslag * @triggers HTML_SECEDIT_BUTTON
10640868f2fSAdrian Lang */
10740868f2fSAdrian Langfunction html_secedit_button($matches){
108ada0d779SMichael Hamann    $json = htmlspecialchars_decode($matches[1], ENT_QUOTES);
109ada0d779SMichael Hamann    $data = json_decode($json, true);
110ec57f119SLarsDW223    if ($data == NULL) {
111*79a2d784SGerrit Uitslag        return '';
11206917fceSMichael Große    }
113ec57f119SLarsDW223    $data ['target'] = strtolower($data['target']);
114ec57f119SLarsDW223    $data ['hid'] = strtolower($data['hid']);
11540868f2fSAdrian Lang
116cbb44eabSAndreas Gohr    return Event::createAndTrigger('HTML_SECEDIT_BUTTON', $data,
11740868f2fSAdrian Lang                         'html_secedit_get_button');
11840868f2fSAdrian Lang}
11940868f2fSAdrian Lang
12040868f2fSAdrian Lang/**
12140868f2fSAdrian Lang * prints a section editing button
12240868f2fSAdrian Lang * used as default action form HTML_SECEDIT_BUTTON
12340868f2fSAdrian Lang *
12440868f2fSAdrian Lang * @author Adrian Lang <lang@cosmocode.de>
12542ea7f44SGerrit Uitslag *
12642ea7f44SGerrit Uitslag * @param array $data name, section id and target
12742ea7f44SGerrit Uitslag * @return string html
12840868f2fSAdrian Lang */
12940868f2fSAdrian Langfunction html_secedit_get_button($data) {
13040868f2fSAdrian Lang    global $ID;
13140868f2fSAdrian Lang    global $INFO;
13240868f2fSAdrian Lang
1336d9eab4dSMichael Hamann    if (!isset($data['name']) || $data['name'] === '') return '';
13440868f2fSAdrian Lang
13540868f2fSAdrian Lang    $name = $data['name'];
13640868f2fSAdrian Lang    unset($data['name']);
13740868f2fSAdrian Lang
138905fa971SAdrian Lang    $secid = $data['secid'];
139905fa971SAdrian Lang    unset($data['secid']);
140905fa971SAdrian Lang
1417afe5d93SSatoshi Sahara    $params = array_merge(
1427afe5d93SSatoshi Sahara           array('do'  => 'edit', 'rev' => $INFO['lastmod'], 'summary' => '['.$name.'] '),
1437afe5d93SSatoshi Sahara           $data
1447afe5d93SSatoshi Sahara    );
1457afe5d93SSatoshi Sahara
1467afe5d93SSatoshi Sahara    $html = '<div class="secedit editbutton_'.$data['target'] .' editbutton_'.$secid .'">';
1477afe5d93SSatoshi Sahara    $html.= html_btn('secedit', $ID, '', $params, 'post', $name);
1487afe5d93SSatoshi Sahara    $html.= '</div>';
1497afe5d93SSatoshi Sahara    return $html;
150f3f0262cSandi}
151f3f0262cSandi
152f3f0262cSandi/**
153d6c9c552Smatthiasgrimm * Just the back to top button (in its own form)
1546b13307fSandi *
1556b13307fSandi * @author Andreas Gohr <andi@splitbrain.org>
15642ea7f44SGerrit Uitslag *
15742ea7f44SGerrit Uitslag * @return string html
1586b13307fSandi */
1596b13307fSandifunction html_topbtn() {
1606b13307fSandi    global $lang;
1616b13307fSandi
162*79a2d784SGerrit Uitslag    return '<a class="nolink" href="#dokuwiki__top">'
1637afe5d93SSatoshi Sahara        .'<button class="button" onclick="window.scrollTo(0, 0)" title="'. $lang['btn_top'] .'">'
1647afe5d93SSatoshi Sahara        . $lang['btn_top']
1657afe5d93SSatoshi Sahara        .'</button></a>';
1666b13307fSandi}
1676b13307fSandi
1686b13307fSandi/**
169d67ca2c0Smatthiasgrimm * Displays a button (using its own form)
17035dae8b0SBen Coburn * If tooltip exists, the access key tooltip is replaced.
17115fae107Sandi *
17215fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
17342ea7f44SGerrit Uitslag *
17442ea7f44SGerrit Uitslag * @param string         $name
17542ea7f44SGerrit Uitslag * @param string         $id
17642ea7f44SGerrit Uitslag * @param string         $akey   access key
177e3710957SGerrit Uitslag * @param string[]       $params key-value pairs added as hidden inputs
17842ea7f44SGerrit Uitslag * @param string         $method
17942ea7f44SGerrit Uitslag * @param string         $tooltip
18042ea7f44SGerrit Uitslag * @param bool|string    $label  label text, false: lookup btn_$name in localization
181e824d633SMichael Große * @param string         $svg (optional) svg code, inserted into the button
18242ea7f44SGerrit Uitslag * @return string
183f3f0262cSandi */
184e824d633SMichael Großefunction html_btn($name, $id, $akey, $params, $method = 'get', $tooltip = '', $label = false, $svg = null) {
185f3f0262cSandi    global $conf;
186f3f0262cSandi    global $lang;
187f3f0262cSandi
188f5baf821SAnika Henke    if (!$label)
189f3f0262cSandi        $label = $lang['btn_'.$name];
190f3f0262cSandi
19149c713a3Sandi    //filter id (without urlencoding)
19249c713a3Sandi    $id = idfilter($id,false);
193f3f0262cSandi
194f3f0262cSandi    //make nice URLs even for buttons
1956c7843b5Sandi    if ($conf['userewrite'] == 2) {
1966c7843b5Sandi        $script = DOKU_BASE.DOKU_SCRIPT.'/'.$id;
1976c7843b5Sandi    } elseif ($conf['userewrite']) {
1986c7843b5Sandi        $script = DOKU_BASE.$id;
1996c7843b5Sandi    } else {
2008b00ebcfSandi        $script = DOKU_BASE.DOKU_SCRIPT;
201f3f0262cSandi        $params['id'] = $id;
202f3f0262cSandi    }
203f3f0262cSandi
2047afe5d93SSatoshi Sahara    $html = '<form class="button btn_'.$name.'" method="'.$method.'" action="'.$script.'"><div class="no">';
205f3f0262cSandi
20606a4bf8fSAndreas Gohr    if (is_array($params)) {
2079e491c01SAndreas Gohr        foreach ($params as $key => $val) {
2087afe5d93SSatoshi Sahara            $html .= '<input type="hidden" name="'.$key.'" value="'.hsc($val).'" />';
209f3f0262cSandi        }
21006a4bf8fSAndreas Gohr    }
211f3f0262cSandi
2127afe5d93SSatoshi Sahara    $tip = empty($tooltip) ? hsc($label) : hsc($tooltip);
21311ea018fSAndreas Gohr
2147afe5d93SSatoshi Sahara    $html .= '<button type="submit" ';
21511ea018fSAndreas Gohr    if ($akey) {
21607493d05SAnika Henke        $tip  .= ' ['.strtoupper($akey).']';
2177afe5d93SSatoshi Sahara        $html .= 'accesskey="'.$akey.'" ';
21835dae8b0SBen Coburn    }
2197afe5d93SSatoshi Sahara    $html .= 'title="'.$tip.'">';
220e824d633SMichael Große    if ($svg) {
2217afe5d93SSatoshi Sahara        $html .= '<span>'. hsc($label) .'</span>'. inlineSVG($svg);
222679dba01SMichael Große    } else {
2237afe5d93SSatoshi Sahara        $html .= hsc($label);
224679dba01SMichael Große    }
2257afe5d93SSatoshi Sahara    $html .= '</button>';
2267afe5d93SSatoshi Sahara    $html .= '</div></form>';
227f3f0262cSandi
2287afe5d93SSatoshi Sahara    return $html;
229f3f0262cSandi}
2300747f5d7Sghi/**
2310747f5d7Sghi * show a revision warning
2320747f5d7Sghi *
2330747f5d7Sghi * @author Szymon Olewniczak <dokuwiki@imz.re>
23487f229e8SSatoshi Sahara * @deprecated 2020-07-18
2350747f5d7Sghi */
236c8556525Sghifunction html_showrev() {
237*79a2d784SGerrit Uitslag    dbg_deprecated(PageView::class .'::showrev()');
2380747f5d7Sghi}
239f3f0262cSandi
240f3f0262cSandi/**
24142ea7f44SGerrit Uitslag * Show a wiki page
24215fae107Sandi *
24315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
24442ea7f44SGerrit Uitslag *
24542ea7f44SGerrit Uitslag * @param null|string $txt wiki text or null for showing $ID
246bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
24715fae107Sandi */
24811c78c94SAndreas Gohrfunction html_show($txt=null) {
249*79a2d784SGerrit Uitslag    dbg_deprecated(PageView::class .'::show()');
250bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\PageView($txt))->show();
251f3f0262cSandi}
252f3f0262cSandi
253f3f0262cSandi/**
254ee4c4a1bSAndreas Gohr * ask the user about how to handle an exisiting draft
255ee4c4a1bSAndreas Gohr *
256ee4c4a1bSAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
257bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
258ee4c4a1bSAndreas Gohr */
259ee4c4a1bSAndreas Gohrfunction html_draft() {
260*79a2d784SGerrit Uitslag    dbg_deprecated(PageDraft::class .'::show()');
261*79a2d784SGerrit Uitslag    (new dokuwiki\Ui\PageDraft)->show();
262ee4c4a1bSAndreas Gohr}
263ee4c4a1bSAndreas Gohr
264ee4c4a1bSAndreas Gohr/**
265f3f0262cSandi * Highlights searchqueries in HTML code
26615fae107Sandi *
26715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
2687209be23SAndreas Gohr * @author Harry Fuecks <hfuecks@gmail.com>
26942ea7f44SGerrit Uitslag *
27042ea7f44SGerrit Uitslag * @param string $html
27142ea7f44SGerrit Uitslag * @param array|string $phrases
27242ea7f44SGerrit Uitslag * @return string html
273f3f0262cSandi */
274546d3a99SAndreas Gohrfunction html_hilight($html, $phrases) {
2758a803caeSAndreas Gohr    $phrases = (array) $phrases;
2768a803caeSAndreas Gohr    $phrases = array_map('preg_quote_cb', $phrases);
2778a803caeSAndreas Gohr    $phrases = array_map('ft_snippet_re_preprocess', $phrases);
2788a803caeSAndreas Gohr    $phrases = array_filter($phrases);
2798a803caeSAndreas Gohr    $regex = join('|',$phrases);
28060c15d7dSAndreas Gohr
28160c15d7dSAndreas Gohr    if ($regex === '') return $html;
282*79a2d784SGerrit Uitslag    if (!Clean::isUtf8($regex)) return $html;
283f3f0262cSandi
284*79a2d784SGerrit Uitslag    return @preg_replace_callback("/((<[^>]*)|$regex)/ui", function ($match) {
285675d8ce4SSatoshi Sahara        $hlight = unslash($match[0]);
286675d8ce4SSatoshi Sahara        if (!isset($match[2])) {
287688774a0SAnika Henke            $hlight = '<span class="search_hit">'.$hlight.'</span>';
2887209be23SAndreas Gohr        }
2897209be23SAndreas Gohr        return $hlight;
290675d8ce4SSatoshi Sahara    }, $html);
2917209be23SAndreas Gohr}
2927209be23SAndreas Gohr
2937209be23SAndreas Gohr/**
29415fae107Sandi * Display error on locked pages
29515fae107Sandi *
29615fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
2977afe5d93SSatoshi Sahara * @deprecated 2020-07-18 not called anymore, see inc/Action/Locked::tplContent()
29815fae107Sandi */
299ee20e7d1Sandifunction html_locked() {
300*79a2d784SGerrit Uitslag    dbg_deprecated(Locked::class .'::showBanner()');
301a215faf2SSatoshi Sahara    (new dokuwiki\Action\Locked())->showBanner();
302f3f0262cSandi}
303f3f0262cSandi
30415fae107Sandi/**
30515fae107Sandi * list old revisions
30615fae107Sandi *
30715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
30871726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
3098e69fd30SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
310e0c26282SGerrit Uitslag *
311e0c26282SGerrit Uitslag * @param int $first skip the first n changelog lines
31230a159abSSatoshi Sahara * @param string $media_id id of media, or empty for current page
313bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
31415fae107Sandi */
31530a159abSSatoshi Saharafunction html_revisions($first = 0, $media_id = '') {
316*79a2d784SGerrit Uitslag    dbg_deprecated(PageRevisions::class .'::show()');
317b370ebcdSSatoshi Sahara    if ($media_id) {
318b370ebcdSSatoshi Sahara        (new dokuwiki\Ui\MediaRevisions($media_id))->show($first);
319b370ebcdSSatoshi Sahara    } else {
320b370ebcdSSatoshi Sahara        global $INFO;
321b370ebcdSSatoshi Sahara        (new dokuwiki\Ui\PageRevisions($INFO['id']))->show($first);
322b370ebcdSSatoshi Sahara    }
323f3f0262cSandi}
324f3f0262cSandi
32515fae107Sandi/**
32615fae107Sandi * display recent changes
32715fae107Sandi *
32815fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
3295749f1ceSmatthiasgrimm * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
33071726d78SBen Coburn * @author Ben Coburn <btcoburn@silicodon.net>
3318d40b4b6SKate Arzamastseva * @author Kate Arzamastseva <pshns@ukr.net>
33242ea7f44SGerrit Uitslag *
33342ea7f44SGerrit Uitslag * @param int $first
33442ea7f44SGerrit Uitslag * @param string $show_changes
335bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
33615fae107Sandi */
3370739a638SKate Arzamastsevafunction html_recent($first = 0, $show_changes = 'both') {
338*79a2d784SGerrit Uitslag    dbg_deprecated(Recent::class .'::show()');
339bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Recent($first, $show_changes))->show();
340f3f0262cSandi}
341f3f0262cSandi
34215fae107Sandi/**
34315fae107Sandi * Display page index
34415fae107Sandi *
34515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
34642ea7f44SGerrit Uitslag *
34742ea7f44SGerrit Uitslag * @param string $ns
348bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
34915fae107Sandi */
350f3f0262cSandifunction html_index($ns) {
351*79a2d784SGerrit Uitslag    dbg_deprecated(Index::class .'::show()');
352bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Index($ns))->show();
353f3f0262cSandi}
354f3f0262cSandi
355f3f0262cSandi/**
35689b939d7SSatoshi Sahara * Index tree item formatter for html_buildlist()
35715fae107Sandi *
358f3f0262cSandi * User function for html_buildlist()
35915fae107Sandi *
36015fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
36142ea7f44SGerrit Uitslag *
36242ea7f44SGerrit Uitslag * @param array $item
36342ea7f44SGerrit Uitslag * @return string
3649c8632b4SSatoshi Sahara * @deprecated 2020-07-18
365f3f0262cSandi */
3669c8632b4SSatoshi Saharafunction html_list_index($item) {
367*79a2d784SGerrit Uitslag    dbg_deprecated(Index::class .'::formatListItem()');
3689c8632b4SSatoshi Sahara    return (new dokuwiki\Ui\Index)->formatListItem($item);
369f3f0262cSandi}
370f3f0262cSandi
371f3f0262cSandi/**
37289b939d7SSatoshi Sahara * Index list item formatter for html_buildlist()
373cb70c441Sandi *
374a1dee2b9SAdrian Lang * This user function is used in html_buildlist to build the
375cb70c441Sandi * <li> tags for namespaces when displaying the page index
376cb70c441Sandi * it gives different classes to opened or closed "folders"
377cb70c441Sandi *
378cb70c441Sandi * @author Andreas Gohr <andi@splitbrain.org>
37942ea7f44SGerrit Uitslag *
38042ea7f44SGerrit Uitslag * @param array $item
38142ea7f44SGerrit Uitslag * @return string html
3829c8632b4SSatoshi Sahara * @deprecated 2020-07-18
383cb70c441Sandi */
3849c8632b4SSatoshi Saharafunction html_li_index($item) {
385*79a2d784SGerrit Uitslag    dbg_deprecated(Index::class .'::tagListItem()');
3869c8632b4SSatoshi Sahara    return (new dokuwiki\Ui\Index)->tagListItem($item);
387cb70c441Sandi}
388cb70c441Sandi
389cb70c441Sandi/**
39089b939d7SSatoshi Sahara * Default list item formatter for html_buildlist()
39189b939d7SSatoshi Sahara *
39289b939d7SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org>
39389b939d7SSatoshi Sahara *
39489b939d7SSatoshi Sahara * @param array $item
39589b939d7SSatoshi Sahara * @return string html
39689b939d7SSatoshi Sahara * @deprecated 2020-07-18
39789b939d7SSatoshi Sahara */
39889b939d7SSatoshi Saharafunction html_li_default($item){
39989b939d7SSatoshi Sahara    return '<li class="level'.$item['level'].'">';
40089b939d7SSatoshi Sahara}
40189b939d7SSatoshi Sahara
40289b939d7SSatoshi Sahara/**
40315fae107Sandi * Build an unordered list
40415fae107Sandi *
405f3f0262cSandi * Build an unordered list from the given $data array
406f3f0262cSandi * Each item in the array has to have a 'level' property
407f3f0262cSandi * the item itself gets printed by the given $func user
408cb70c441Sandi * function. The second and optional function is used to
409cb70c441Sandi * print the <li> tag. Both user function need to accept
410cb70c441Sandi * a single item.
41115fae107Sandi *
412c5a8fd96SAndreas Gohr * Both user functions can be given as array to point to
413c5a8fd96SAndreas Gohr * a member of an object.
414c5a8fd96SAndreas Gohr *
41515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
41680679bafSGerrit Uitslag *
41780679bafSGerrit Uitslag * @param array    $data  array with item arrays
41880679bafSGerrit Uitslag * @param string   $class class of ul wrapper
41980679bafSGerrit Uitslag * @param callable $func  callback to print an list item
420bde560b4SSatoshi Sahara * @param callable $lifunc (optional) callback to the opening li tag
421bde560b4SSatoshi Sahara * @param bool     $forcewrapper (optional) Trigger building a wrapper ul if the first level is
422ae614416SAnika Henke *                               0 (we have a root object) or 1 (just the root content)
42380679bafSGerrit Uitslag * @return string html of an unordered list
424f3f0262cSandi */
425bde560b4SSatoshi Saharafunction html_buildlist($data, $class, $func, $lifunc = null, $forcewrapper = false) {
426a1dee2b9SAdrian Lang    if (count($data) === 0) {
427a1dee2b9SAdrian Lang        return '';
428a1dee2b9SAdrian Lang    }
429a1dee2b9SAdrian Lang
4302689c55fSMichael Große    $firstElement = reset($data);
4312689c55fSMichael Große    $start_level = $firstElement['level'];
4329e4f7880SAdrian Lang    $level = $start_level;
4339c8632b4SSatoshi Sahara    $html  = '';
434434f5921SHakan Sandell    $open  = 0;
4359e4f7880SAdrian Lang
436bde560b4SSatoshi Sahara    // set callback function to build the <li> tag, formerly defined as html_li_default()
437bde560b4SSatoshi Sahara    if (!is_callable($lifunc)) {
4389c8632b4SSatoshi Sahara       $lifunc = function ($item) {
4399c8632b4SSatoshi Sahara           return '<li class="level'.$item['level'].'">';
4409c8632b4SSatoshi Sahara       };
441bde560b4SSatoshi Sahara    }
442bde560b4SSatoshi Sahara
443f3f0262cSandi    foreach ($data as $item) {
444f3f0262cSandi        if ($item['level'] > $level) {
445f3f0262cSandi            //open new list
446df52d0feSandi            for ($i = 0; $i < ($item['level'] - $level); $i++) {
4479c8632b4SSatoshi Sahara                if ($i) $html .= '<li class="clear">';
4489c8632b4SSatoshi Sahara                $html .= "\n".'<ul class="'.$class.'">'."\n";
449434f5921SHakan Sandell                $open++;
450df52d0feSandi            }
451434f5921SHakan Sandell            $level = $item['level'];
452434f5921SHakan Sandell
453f3f0262cSandi        } elseif ($item['level'] < $level) {
454f3f0262cSandi            //close last item
4559c8632b4SSatoshi Sahara            $html .= '</li>'."\n";
456434f5921SHakan Sandell            while ($level > $item['level'] && $open > 0 ) {
457f3f0262cSandi                //close higher lists
4589c8632b4SSatoshi Sahara                $html .= '</ul>'."\n".'</li>'."\n";
459434f5921SHakan Sandell                $level--;
460434f5921SHakan Sandell                $open--;
461f3f0262cSandi            }
4629c8632b4SSatoshi Sahara        } elseif ($html !== '') {
46387671313SHakan Sandell            //close previous item
4649c8632b4SSatoshi Sahara            $html .= '</li>'."\n";
465f3f0262cSandi        }
466f3f0262cSandi
467f3f0262cSandi        //print item
4689c8632b4SSatoshi Sahara        $html .= call_user_func($lifunc, $item);
4699c8632b4SSatoshi Sahara        $html .= '<div class="li">';
47034dbe711Schris
4719c8632b4SSatoshi Sahara        $html .= call_user_func($func, $item);
4729c8632b4SSatoshi Sahara        $html .= '</div>';
473f3f0262cSandi    }
474f3f0262cSandi
475f3f0262cSandi    //close remaining items and lists
4769c8632b4SSatoshi Sahara    $html .= '</li>'."\n";
477434f5921SHakan Sandell    while ($open-- > 0) {
4789c8632b4SSatoshi Sahara        $html .= '</ul></li>'."\n";
479434f5921SHakan Sandell    }
480434f5921SHakan Sandell
481434f5921SHakan Sandell    if ($forcewrapper || $start_level < 2) {
482434f5921SHakan Sandell        // Trigger building a wrapper ul if the first level is
483434f5921SHakan Sandell        // 0 (we have a root object) or 1 (just the root content)
4849c8632b4SSatoshi Sahara        $html = "\n".'<ul class="'.$class.'">'."\n".$html.'</ul>'."\n";
485f3f0262cSandi    }
486f3f0262cSandi
4879c8632b4SSatoshi Sahara    return $html;
488f3f0262cSandi}
489f3f0262cSandi
49015fae107Sandi/**
49115fae107Sandi * display backlinks
49215fae107Sandi *
49315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
49411df47ecSMichael Klier * @author Michael Klier <chi@chimeric.de>
495bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
49615fae107Sandi */
497f3f0262cSandifunction html_backlinks() {
498*79a2d784SGerrit Uitslag    dbg_deprecated(Backlinks::class .'::show()');
499bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Backlinks)->show();
50095b451bcSAdrian Lang}
50195b451bcSAdrian Lang
50215fae107Sandi/**
503a215faf2SSatoshi Sahara * Get header of diff HTML
504a215faf2SSatoshi Sahara *
505a215faf2SSatoshi Sahara * @param string $l_rev   Left revisions
506a215faf2SSatoshi Sahara * @param string $r_rev   Right revision
507a215faf2SSatoshi Sahara * @param string $id      Page id, if null $ID is used
508a215faf2SSatoshi Sahara * @param bool   $media   If it is for media files
509a215faf2SSatoshi Sahara * @param bool   $inline  Return the header on a single line
510a215faf2SSatoshi Sahara * @return string[] HTML snippets for diff header
511a215faf2SSatoshi Sahara * @deprecated 2020-07-18
512a215faf2SSatoshi Sahara */
513a215faf2SSatoshi Saharafunction html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = false) {
514*79a2d784SGerrit Uitslag    dbg_deprecated('see '. PageDiff::class .'::buildDiffHead()');
515*79a2d784SGerrit Uitslag    return ['', '', '', ''];
516a215faf2SSatoshi Sahara}
517a215faf2SSatoshi Sahara
518a215faf2SSatoshi Sahara/**
51904e99fe1SGerrit Uitslag * Show diff
520baf0c3e5SGerrit Uitslag * between current page version and provided $text
521baf0c3e5SGerrit Uitslag * or between the revisions provided via GET or POST
52215fae107Sandi *
52315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
524baf0c3e5SGerrit Uitslag * @param  string $text  when non-empty: compare with this text with most current version
52504e99fe1SGerrit Uitslag * @param  bool   $intro display the intro text
5268d5e837eSMichael Hamann * @param  string $type  type of the diff (inline or sidebyside)
527bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
52815fae107Sandi */
52972165381SAndreas Gohrfunction html_diff($text = '', $intro = true, $type = null) {
530*79a2d784SGerrit Uitslag    dbg_deprecated(PageDiff::class .'::show()');
531edb50e6aSSatoshi Sahara    global $INFO;
532e4c881bdSSatoshi Sahara    (new dokuwiki\Ui\PageDiff($INFO['id']))->compareWith($text)->preference([
533edb50e6aSSatoshi Sahara        'showIntro' => $intro,
534edb50e6aSSatoshi Sahara        'difftype'  => $type,
535edb50e6aSSatoshi Sahara    ])->show();
536fcfecb69SChristopher Smith}
537fcfecb69SChristopher Smith
53815fae107Sandi/**
539a215faf2SSatoshi Sahara * Create html for revision navigation
540a215faf2SSatoshi Sahara *
541a215faf2SSatoshi Sahara * @param PageChangeLog $pagelog changelog object of current page
542a215faf2SSatoshi Sahara * @param string        $type    inline vs sidebyside
543a215faf2SSatoshi Sahara * @param int           $l_rev   left revision timestamp
544a215faf2SSatoshi Sahara * @param int           $r_rev   right revision timestamp
545a215faf2SSatoshi Sahara * @return string[] html of left and right navigation elements
546a215faf2SSatoshi Sahara * @deprecated 2020-07-18
547a215faf2SSatoshi Sahara */
548a215faf2SSatoshi Saharafunction html_diff_navigation($pagelog, $type, $l_rev, $r_rev) {
549*79a2d784SGerrit Uitslag    dbg_deprecated('see '. PageDiff::class .'::buildRevisionsNavigation()');
550*79a2d784SGerrit Uitslag    return ['', ''];
551a215faf2SSatoshi Sahara}
552a215faf2SSatoshi Sahara
553a215faf2SSatoshi Sahara/**
554a215faf2SSatoshi Sahara * Create html link to a diff defined by two revisions
555a215faf2SSatoshi Sahara *
556a215faf2SSatoshi Sahara * @param string $difftype display type
557a215faf2SSatoshi Sahara * @param string $linktype
558a215faf2SSatoshi Sahara * @param int $lrev oldest revision
559a215faf2SSatoshi Sahara * @param int $rrev newest revision or null for diff with current revision
560a215faf2SSatoshi Sahara * @return string html of link to a diff
561a215faf2SSatoshi Sahara * @deprecated 2020-07-18
562a215faf2SSatoshi Sahara */
563a215faf2SSatoshi Saharafunction html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null) {
564*79a2d784SGerrit Uitslag    dbg_deprecated('see '. PageDiff::class .'::diffViewlink()');
565*79a2d784SGerrit Uitslag    return '';
566a215faf2SSatoshi Sahara}
567a215faf2SSatoshi Sahara
568a215faf2SSatoshi Sahara/**
569a215faf2SSatoshi Sahara * Insert soft breaks in diff html
570a215faf2SSatoshi Sahara *
571a215faf2SSatoshi Sahara * @param string $diffhtml
572a215faf2SSatoshi Sahara * @return string
573a215faf2SSatoshi Sahara * @deprecated 2020-07-18
574a215faf2SSatoshi Sahara */
575a215faf2SSatoshi Saharafunction html_insert_softbreaks($diffhtml) {
576*79a2d784SGerrit Uitslag    dbg_deprecated(PageDiff::class .'::insertSoftbreaks()');
57787922387SSatoshi Sahara    return (new dokuwiki\Ui\PageDiff)->insertSoftbreaks($diffhtml);
578a215faf2SSatoshi Sahara}
579a215faf2SSatoshi Sahara
580a215faf2SSatoshi Sahara/**
58115fae107Sandi * show warning on conflict detection
58215fae107Sandi *
58315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
58442ea7f44SGerrit Uitslag *
58542ea7f44SGerrit Uitslag * @param string $text
58642ea7f44SGerrit Uitslag * @param string $summary
587bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
58815fae107Sandi */
589f3f0262cSandifunction html_conflict($text, $summary) {
590*79a2d784SGerrit Uitslag    dbg_deprecated(PageConflict::class .'::show()');
591edb50e6aSSatoshi Sahara    (new dokuwiki\Ui\PageConflict($text, $summary))->show();
592f3f0262cSandi}
593f3f0262cSandi
594f3f0262cSandi/**
59515fae107Sandi * Prints the global message array
59615fae107Sandi *
59715fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
598f3f0262cSandi */
599f3f0262cSandifunction html_msgarea() {
600cc58224cSMichael Hamann    global $MSG, $MSG_shown;
6018d5e837eSMichael Hamann    /** @var array $MSG */
602cc58224cSMichael Hamann    // store if the global $MSG has already been shown and thus HTML output has been started
603cc58224cSMichael Hamann    $MSG_shown = true;
604cc58224cSMichael Hamann
605f3f0262cSandi    if (!isset($MSG)) return;
606f3f0262cSandi
6074af9f0d4SAndreas Gohr    $shown = array();
608f3f0262cSandi    foreach ($MSG as $msg) {
6094af9f0d4SAndreas Gohr        $hash = md5($msg['msg']);
6104af9f0d4SAndreas Gohr        if (isset($shown[$hash])) continue; // skip double messages
611f755f9abSChristopher Smith        if (info_msg_allowed($msg)) {
612f3f0262cSandi            print '<div class="'.$msg['lvl'].'">';
613f3f0262cSandi            print $msg['msg'];
614f3f0262cSandi            print '</div>';
615d3bae478SChristopher Smith        }
6164af9f0d4SAndreas Gohr        $shown[$hash] = 1;
617f3f0262cSandi    }
618cc58224cSMichael Hamann
619cc58224cSMichael Hamann    unset($GLOBALS['MSG']);
620f3f0262cSandi}
621f3f0262cSandi
622f3f0262cSandi/**
623f3f0262cSandi * Prints the registration form
62415fae107Sandi *
62515fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
626bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
627f3f0262cSandi */
628f3f0262cSandifunction html_register() {
629*79a2d784SGerrit Uitslag    dbg_deprecated(UserRegister::class .'::show()');
630bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\UserRegister)->show();
631f3f0262cSandi}
632f3f0262cSandi
633f3f0262cSandi/**
6348b06d178Schris * Print the update profile form
6358b06d178Schris *
6368b06d178Schris * @author Christopher Smith <chris@jalakai.co.uk>
6378b06d178Schris * @author Andreas Gohr <andi@splitbrain.org>
638bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
6398b06d178Schris */
6408b06d178Schrisfunction html_updateprofile() {
641*79a2d784SGerrit Uitslag    dbg_deprecated(UserProfile::class .'::show()');
642bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\UserProfile)->show();
6438b06d178Schris}
6448b06d178Schris
6458b06d178Schris/**
6467c4635c4SAdrian Lang * Preprocess edit form data
64715fae107Sandi *
64815fae107Sandi * @author   Andreas Gohr <andi@splitbrain.org>
6492ffea8f2SAdrian Lang *
650bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
651f3f0262cSandi */
6525a932e77SAdrian Langfunction html_edit() {
653*79a2d784SGerrit Uitslag    dbg_deprecated(Editor::class .'::show()');
654bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\Editor)->show();
655b6912aeaSAndreas Gohr}
656b6912aeaSAndreas Gohr
657b6912aeaSAndreas Gohr/**
658bf69f8cbSSatoshi Sahara * Display the default edit form
659bf69f8cbSSatoshi Sahara *
660bf69f8cbSSatoshi Sahara * Is the default action for HTML_EDIT_FORMSELECTION.
661bf69f8cbSSatoshi Sahara *
662*79a2d784SGerrit Uitslag * @param array $param
663bf69f8cbSSatoshi Sahara * @deprecated 2020-07-18
664bf69f8cbSSatoshi Sahara */
665bf69f8cbSSatoshi Saharafunction html_edit_form($param) {
666*79a2d784SGerrit Uitslag    dbg_deprecated(Editor::class .'::addTextarea()');
667*79a2d784SGerrit Uitslag    (new dokuwiki\Ui\Editor)->addTextarea($param);
668bf69f8cbSSatoshi Sahara}
669bf69f8cbSSatoshi Sahara
670bf69f8cbSSatoshi Sahara/**
671f3f0262cSandi * prints some debug info
67215fae107Sandi *
67315fae107Sandi * @author Andreas Gohr <andi@splitbrain.org>
674f3f0262cSandi */
675f3f0262cSandifunction html_debug() {
676f3f0262cSandi    global $conf;
677d16a4edaSandi    global $lang;
678e1d9dcc8SAndreas Gohr    /** @var AuthPlugin $auth */
6795298a619SAndreas Gohr    global $auth;
680100a97e3SAndreas Gohr    global $INFO;
681100a97e3SAndreas Gohr
68228fb55ffSandi    //remove sensitive data
68328fb55ffSandi    $cnf = $conf;
68424297a69SAndreas Gohr    debug_guard($cnf);
685100a97e3SAndreas Gohr    $nfo = $INFO;
68624297a69SAndreas Gohr    debug_guard($nfo);
687100a97e3SAndreas Gohr    $ses = $_SESSION;
68824297a69SAndreas Gohr    debug_guard($ses);
689f3f0262cSandi
690f3f0262cSandi    print '<html><body>';
691f3f0262cSandi
692f3f0262cSandi    print '<p>When reporting bugs please send all the following ';
693f3f0262cSandi    print 'output as a mail to andi@splitbrain.org ';
694f3f0262cSandi    print 'The best way to do this is to save this page in your browser</p>';
695f3f0262cSandi
696100a97e3SAndreas Gohr    print '<b>$INFO:</b><pre>';
697100a97e3SAndreas Gohr    print_r($nfo);
698100a97e3SAndreas Gohr    print '</pre>';
699100a97e3SAndreas Gohr
700f3f0262cSandi    print '<b>$_SERVER:</b><pre>';
701f3f0262cSandi    print_r($_SERVER);
702f3f0262cSandi    print '</pre>';
703f3f0262cSandi
704f3f0262cSandi    print '<b>$conf:</b><pre>';
70528fb55ffSandi    print_r($cnf);
706f3f0262cSandi    print '</pre>';
707f3f0262cSandi
708ed7b5f09Sandi    print '<b>DOKU_BASE:</b><pre>';
709ed7b5f09Sandi    print DOKU_BASE;
710f3f0262cSandi    print '</pre>';
711f3f0262cSandi
712ed7b5f09Sandi    print '<b>abs DOKU_BASE:</b><pre>';
713ed7b5f09Sandi    print DOKU_URL;
714ed7b5f09Sandi    print '</pre>';
715ed7b5f09Sandi
716ed7b5f09Sandi    print '<b>rel DOKU_BASE:</b><pre>';
717f3f0262cSandi    print dirname($_SERVER['PHP_SELF']).'/';
718f3f0262cSandi    print '</pre>';
719f3f0262cSandi
720f3f0262cSandi    print '<b>PHP Version:</b><pre>';
721f3f0262cSandi    print phpversion();
722f3f0262cSandi    print '</pre>';
723f3f0262cSandi
724f3f0262cSandi    print '<b>locale:</b><pre>';
725f3f0262cSandi    print setlocale(LC_ALL,0);
726f3f0262cSandi    print '</pre>';
727f3f0262cSandi
728d16a4edaSandi    print '<b>encoding:</b><pre>';
729d16a4edaSandi    print $lang['encoding'];
730d16a4edaSandi    print '</pre>';
731d16a4edaSandi
7325298a619SAndreas Gohr    if ($auth) {
7335298a619SAndreas Gohr        print '<b>Auth backend capabilities:</b><pre>';
7342f46ade0SChristopher Smith        foreach ($auth->getCapabilities() as $cando) {
7357afe5d93SSatoshi Sahara            print '   '.str_pad($cando,16) .' => '. (int)$auth->canDo($cando) . DOKU_LF;
7362f46ade0SChristopher Smith        }
7375298a619SAndreas Gohr        print '</pre>';
7385298a619SAndreas Gohr    }
7395298a619SAndreas Gohr
7403aa54d7cSAndreas Gohr    print '<b>$_SESSION:</b><pre>';
741100a97e3SAndreas Gohr    print_r($ses);
7423aa54d7cSAndreas Gohr    print '</pre>';
7433aa54d7cSAndreas Gohr
744f3f0262cSandi    print '<b>Environment:</b><pre>';
745f3f0262cSandi    print_r($_ENV);
746f3f0262cSandi    print '</pre>';
747f3f0262cSandi
748f3f0262cSandi    print '<b>PHP settings:</b><pre>';
749f3f0262cSandi    $inis = ini_get_all();
750f3f0262cSandi    print_r($inis);
751f3f0262cSandi    print '</pre>';
752f3f0262cSandi
753e89b7c1eSChristopher Smith    if (function_exists('apache_get_version')) {
75459bc3b48SGerrit Uitslag        $apache = array();
755e89b7c1eSChristopher Smith        $apache['version'] = apache_get_version();
756e89b7c1eSChristopher Smith
757e89b7c1eSChristopher Smith        if (function_exists('apache_get_modules')) {
758e89b7c1eSChristopher Smith            $apache['modules'] = apache_get_modules();
759e89b7c1eSChristopher Smith        }
760e89b7c1eSChristopher Smith        print '<b>Apache</b><pre>';
761e89b7c1eSChristopher Smith        print_r($apache);
762e89b7c1eSChristopher Smith        print '</pre>';
763e89b7c1eSChristopher Smith    }
764e89b7c1eSChristopher Smith
765f3f0262cSandi    print '</body></html>';
766f3f0262cSandi}
767f3f0262cSandi
76810271ce4SAndreas Gohr/**
7698b06d178Schris * Form to request a new password for an existing account
7708b06d178Schris *
7718b06d178Schris * @author Benoit Chesneau <benoit@bchesneau.info>
772cc204bbdSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de>
773bab2b7f0SSatoshi Sahara * @deprecated 2020-07-18
77411e2ce22Schris */
7758b06d178Schrisfunction html_resendpwd() {
776*79a2d784SGerrit Uitslag    dbg_deprecated(UserResendPwd::class .'::show()');
777bab2b7f0SSatoshi Sahara    (new dokuwiki\Ui\UserResendPwd)->show();
778cc204bbdSAndreas Gohr}
779cc204bbdSAndreas Gohr
780fdb8d77bSTom N Harris/**
781b8595a66SAndreas Gohr * Return the TOC rendered to XHTML
782b8595a66SAndreas Gohr *
783b8595a66SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
78442ea7f44SGerrit Uitslag *
78542ea7f44SGerrit Uitslag * @param array $toc
78642ea7f44SGerrit Uitslag * @return string html
787b8595a66SAndreas Gohr */
788b8595a66SAndreas Gohrfunction html_TOC($toc) {
789b8595a66SAndreas Gohr    if (!count($toc)) return '';
790b8595a66SAndreas Gohr    global $lang;
791b8595a66SAndreas Gohr    $out  = '<!-- TOC START -->'.DOKU_LF;
792158a5bffSDeathCamel57    $out .= '<div id="dw__toc" class="dw__toc">'.DOKU_LF;
79348722ac8SAnika Henke    $out .= '<h3 class="toggle">';
794b8595a66SAndreas Gohr    $out .= $lang['toc'];
795d5acc30dSAnika Henke    $out .= '</h3>'.DOKU_LF;
796d5acc30dSAnika Henke    $out .= '<div>'.DOKU_LF;
797bde560b4SSatoshi Sahara    $out .= html_buildlist($toc, 'toc', 'html_list_toc', null, true);
798b8595a66SAndreas Gohr    $out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF;
799b8595a66SAndreas Gohr    $out .= '<!-- TOC END -->'.DOKU_LF;
800db959ae3SAndreas Gohr    return $out;
801db959ae3SAndreas Gohr}
802b8595a66SAndreas Gohr
803b8595a66SAndreas Gohr/**
804b8595a66SAndreas Gohr * Callback for html_buildlist
80542ea7f44SGerrit Uitslag *
80642ea7f44SGerrit Uitslag * @param array $item
80742ea7f44SGerrit Uitslag * @return string html
808b8595a66SAndreas Gohr */
809b8595a66SAndreas Gohrfunction html_list_toc($item) {
810c66972f2SAdrian Lang    if (isset($item['hid'])){
8117d91652aSAndreas Gohr        $link = '#'.$item['hid'];
8127d91652aSAndreas Gohr    } else {
8137d91652aSAndreas Gohr        $link = $item['link'];
8147d91652aSAndreas Gohr    }
8157d91652aSAndreas Gohr
816d5acc30dSAnika Henke    return '<a href="'.$link.'">'.hsc($item['title']).'</a>';
817b8595a66SAndreas Gohr}
818b8595a66SAndreas Gohr
819b8595a66SAndreas Gohr/**
820b8595a66SAndreas Gohr * Helper function to build TOC items
821b8595a66SAndreas Gohr *
822b8595a66SAndreas Gohr * Returns an array ready to be added to a TOC array
823b8595a66SAndreas Gohr *
824b8595a66SAndreas Gohr * @param string $link  - where to link (if $hash set to '#' it's a local anchor)
825b8595a66SAndreas Gohr * @param string $text  - what to display in the TOC
826b8595a66SAndreas Gohr * @param int    $level - nesting level
827b8595a66SAndreas Gohr * @param string $hash  - is prepended to the given $link, set blank if you want full links
8288d5e837eSMichael Hamann * @return array the toc item
829b8595a66SAndreas Gohr */
830b8595a66SAndreas Gohrfunction html_mktocitem($link, $text, $level, $hash='#') {
831bde560b4SSatoshi Sahara    return  array(
832bde560b4SSatoshi Sahara            'link'  => $hash.$link,
833b8595a66SAndreas Gohr            'title' => $text,
834b8595a66SAndreas Gohr            'type'  => 'ul',
835bde560b4SSatoshi Sahara            'level' => $level
836bde560b4SSatoshi Sahara    );
837b8595a66SAndreas Gohr}
838b8595a66SAndreas Gohr
839b8595a66SAndreas Gohr/**
840fdb8d77bSTom N Harris * Output a Doku_Form object.
841fdb8d77bSTom N Harris * Triggers an event with the form name: HTML_{$name}FORM_OUTPUT
842fdb8d77bSTom N Harris *
843fdb8d77bSTom N Harris * @author Tom N Harris <tnharris@whoopdedo.org>
84442ea7f44SGerrit Uitslag *
8458d5e837eSMichael Hamann * @param string     $name The name of the form
8468d5e837eSMichael Hamann * @param Doku_Form  $form The form
8472162df3aSSatoshi Sahara * @return void
8482162df3aSSatoshi Sahara * @deprecated 2020-07-18
849fdb8d77bSTom N Harris */
850c29600d0SSatoshi Saharafunction html_form($name, $form) {
8518a5f08afSSatoshi Sahara    dbg_deprecated('use dokuwiki\Form\Form instead of Doku_Form');
852fdb8d77bSTom N Harris    // Safety check in case the caller forgets.
853fdb8d77bSTom N Harris    $form->endFieldset();
854cbb44eabSAndreas Gohr    Event::createAndTrigger('HTML_'.strtoupper($name).'FORM_OUTPUT', $form, 'html_form_output', false);
855fdb8d77bSTom N Harris}
856fdb8d77bSTom N Harris
857fdb8d77bSTom N Harris/**
858fdb8d77bSTom N Harris * Form print function.
859c29600d0SSatoshi Sahara * Just calls printForm() on the form object.
86042ea7f44SGerrit Uitslag *
861c29600d0SSatoshi Sahara * @param Doku_Form $form The form
8622162df3aSSatoshi Sahara * @return void
8632162df3aSSatoshi Sahara * @deprecated 2020-07-18
864fdb8d77bSTom N Harris */
86525dd2a2fSSatoshi Saharafunction html_form_output($form) {
8668a5f08afSSatoshi Sahara    dbg_deprecated('use dokuwiki\Form\Form::toHTML()');
86725dd2a2fSSatoshi Sahara    $form->printForm();
86825dd2a2fSSatoshi Sahara}
869340756e4Sandi
87007bf32b2SAndreas Gohr/**
87107bf32b2SAndreas Gohr * Embed a flash object in HTML
87207bf32b2SAndreas Gohr *
87307bf32b2SAndreas Gohr * This will create the needed HTML to embed a flash movie in a cross browser
87407bf32b2SAndreas Gohr * compatble way using valid XHTML
87507bf32b2SAndreas Gohr *
87607bf32b2SAndreas Gohr * The parameters $params, $flashvars and $atts need to be associative arrays.
87707bf32b2SAndreas Gohr * No escaping needs to be done for them. The alternative content *has* to be
87807bf32b2SAndreas Gohr * escaped because it is used as is. If no alternative content is given
87907bf32b2SAndreas Gohr * $lang['noflash'] is used.
88007bf32b2SAndreas Gohr *
88107bf32b2SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org>
88207bf32b2SAndreas Gohr * @link   http://latrine.dgx.cz/how-to-correctly-insert-a-flash-into-xhtml
88307bf32b2SAndreas Gohr *
88407bf32b2SAndreas Gohr * @param string $swf      - the SWF movie to embed
88507bf32b2SAndreas Gohr * @param int $width       - width of the flash movie in pixels
88607bf32b2SAndreas Gohr * @param int $height      - height of the flash movie in pixels
88707bf32b2SAndreas Gohr * @param array $params    - additional parameters (<param>)
88807bf32b2SAndreas Gohr * @param array $flashvars - parameters to be passed in the flashvar parameter
88907bf32b2SAndreas Gohr * @param array $atts      - additional attributes for the <object> tag
89007bf32b2SAndreas Gohr * @param string $alt      - alternative content (is NOT automatically escaped!)
891b3d1090eSMichael Hamann * @return string         - the XHTML markup
89207bf32b2SAndreas Gohr */
89307bf32b2SAndreas Gohrfunction html_flashobject($swf,$width,$height,$params=null,$flashvars=null,$atts=null,$alt=''){
89407bf32b2SAndreas Gohr    global $lang;
89507bf32b2SAndreas Gohr
89607bf32b2SAndreas Gohr    $out = '';
89707bf32b2SAndreas Gohr
89807bf32b2SAndreas Gohr    // prepare the object attributes
89907bf32b2SAndreas Gohr    if(is_null($atts)) $atts = array();
90007bf32b2SAndreas Gohr    $atts['width']  = (int) $width;
901d4c61e61SAndreas Gohr    $atts['height'] = (int) $height;
90207bf32b2SAndreas Gohr    if(!$atts['width'])  $atts['width']  = 425;
90307bf32b2SAndreas Gohr    if(!$atts['height']) $atts['height'] = 350;
90407bf32b2SAndreas Gohr
90507bf32b2SAndreas Gohr    // add object attributes for standard compliant browsers
90607bf32b2SAndreas Gohr    $std = $atts;
90707bf32b2SAndreas Gohr    $std['type'] = 'application/x-shockwave-flash';
90807bf32b2SAndreas Gohr    $std['data'] = $swf;
90907bf32b2SAndreas Gohr
91007bf32b2SAndreas Gohr    // add object attributes for IE
91107bf32b2SAndreas Gohr    $ie  = $atts;
91207bf32b2SAndreas Gohr    $ie['classid'] = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
91307bf32b2SAndreas Gohr
91407bf32b2SAndreas Gohr    // open object (with conditional comments)
91507bf32b2SAndreas Gohr    $out .= '<!--[if !IE]> -->'.NL;
91607bf32b2SAndreas Gohr    $out .= '<object '.buildAttributes($std).'>'.NL;
91707bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->'.NL;
91807bf32b2SAndreas Gohr    $out .= '<!--[if IE]>'.NL;
91907bf32b2SAndreas Gohr    $out .= '<object '.buildAttributes($ie).'>'.NL;
92007bf32b2SAndreas Gohr    $out .= '    <param name="movie" value="'.hsc($swf).'" />'.NL;
9219ae41cdcSAndreas Gohr    $out .= '<!--><!-- -->'.NL;
92207bf32b2SAndreas Gohr
92307bf32b2SAndreas Gohr    // print params
92407bf32b2SAndreas Gohr    if(is_array($params)) foreach($params as $key => $val){
92507bf32b2SAndreas Gohr        $out .= '  <param name="'.hsc($key).'" value="'.hsc($val).'" />'.NL;
92607bf32b2SAndreas Gohr    }
92707bf32b2SAndreas Gohr
92807bf32b2SAndreas Gohr    // add flashvars
92907bf32b2SAndreas Gohr    if(is_array($flashvars)){
930d4c61e61SAndreas Gohr        $out .= '  <param name="FlashVars" value="'.buildURLparams($flashvars).'" />'.NL;
93107bf32b2SAndreas Gohr    }
93207bf32b2SAndreas Gohr
93307bf32b2SAndreas Gohr    // alternative content
93407bf32b2SAndreas Gohr    if($alt){
93507bf32b2SAndreas Gohr        $out .= $alt.NL;
93607bf32b2SAndreas Gohr    }else{
93707bf32b2SAndreas Gohr        $out .= $lang['noflash'].NL;
93807bf32b2SAndreas Gohr    }
93907bf32b2SAndreas Gohr
94007bf32b2SAndreas Gohr    // finish
94107bf32b2SAndreas Gohr    $out .= '</object>'.NL;
94207bf32b2SAndreas Gohr    $out .= '<!-- <![endif]-->'.NL;
94307bf32b2SAndreas Gohr
94407bf32b2SAndreas Gohr    return $out;
94507bf32b2SAndreas Gohr}
94607bf32b2SAndreas Gohr
9478d5e837eSMichael Hamann/**
9488d5e837eSMichael Hamann * Prints HTML code for the given tab structure
9498d5e837eSMichael Hamann *
9508d5e837eSMichael Hamann * @param array  $tabs        tab structure
9518d5e837eSMichael Hamann * @param string $current_tab the current tab id
9522162df3aSSatoshi Sahara * @return void
9538d5e837eSMichael Hamann */
95495b451bcSAdrian Langfunction html_tabs($tabs, $current_tab = null) {
95594add303SAnika Henke    echo '<ul class="tabs">'.NL;
95695b451bcSAdrian Lang
95795b451bcSAdrian Lang    foreach ($tabs as $id => $tab) {
95895b451bcSAdrian Lang        html_tab($tab['href'], $tab['caption'], $id === $current_tab);
95995b451bcSAdrian Lang    }
96095b451bcSAdrian Lang
96194add303SAnika Henke    echo '</ul>'.NL;
96295b451bcSAdrian Lang}
963cd2a4cfdSAnika Henke
96495b451bcSAdrian Lang/**
96595b451bcSAdrian Lang * Prints a single tab
96695b451bcSAdrian Lang *
96795b451bcSAdrian Lang * @author Kate Arzamastseva <pshns@ukr.net>
96895b451bcSAdrian Lang * @author Adrian Lang <mail@adrianlang.de>
96995b451bcSAdrian Lang *
97095b451bcSAdrian Lang * @param string $href - tab href
97195b451bcSAdrian Lang * @param string $caption - tab caption
97295b451bcSAdrian Lang * @param boolean $selected - is tab selected
9732162df3aSSatoshi Sahara * @return void
97495b451bcSAdrian Lang */
97595b451bcSAdrian Lang
97695b451bcSAdrian Langfunction html_tab($href, $caption, $selected = false) {
97795b451bcSAdrian Lang    $tab = '<li>';
97895b451bcSAdrian Lang    if ($selected) {
97995b451bcSAdrian Lang        $tab .= '<strong>';
98095b451bcSAdrian Lang    } else {
98195b451bcSAdrian Lang        $tab .= '<a href="' . hsc($href) . '">';
98295b451bcSAdrian Lang    }
98395b451bcSAdrian Lang    $tab .= hsc($caption)
98495b451bcSAdrian Lang         .  '</' . ($selected ? 'strong' : 'a') . '>'
98594add303SAnika Henke         .  '</li>'.NL;
98695b451bcSAdrian Lang    echo $tab;
98795b451bcSAdrian Lang}
98895b451bcSAdrian Lang
989cd2a4cfdSAnika Henke/**
990cd2a4cfdSAnika Henke * Display size change
991cd2a4cfdSAnika Henke *
992cd2a4cfdSAnika Henke * @param int $sizechange - size of change in Bytes
993e34d6962SSatoshi Sahara * @param Doku_Form $form - (optional) form to add elements to
994e34d6962SSatoshi Sahara * @return void|string
995cd2a4cfdSAnika Henke */
996e34d6962SSatoshi Saharafunction html_sizechange($sizechange, $form = null) {
997cd2a4cfdSAnika Henke    if (isset($sizechange)) {
998cd2a4cfdSAnika Henke        $class = 'sizechange';
999cd2a4cfdSAnika Henke        $value = filesize_h(abs($sizechange));
1000cd2a4cfdSAnika Henke        if ($sizechange > 0) {
1001cd2a4cfdSAnika Henke            $class .= ' positive';
1002cd2a4cfdSAnika Henke            $value = '+' . $value;
1003cd2a4cfdSAnika Henke        } elseif ($sizechange < 0) {
1004cd2a4cfdSAnika Henke            $class .= ' negative';
1005cd2a4cfdSAnika Henke            $value = '-' . $value;
10060b78a6edSAnika Henke        } else {
10070b78a6edSAnika Henke            $value = '±' . $value;
1008cd2a4cfdSAnika Henke        }
1009e34d6962SSatoshi Sahara        if (!isset($form)) {
1010e34d6962SSatoshi Sahara            return '<span class="'.$class.'">'.$value.'</span>';
1011b0f23f4eSSatoshi Sahara        } else { // Doku_Form
1012cd2a4cfdSAnika Henke            $form->addElement(form_makeOpenTag('span', array('class' => $class)));
1013cd2a4cfdSAnika Henke            $form->addElement($value);
1014cd2a4cfdSAnika Henke            $form->addElement(form_makeCloseTag('span'));
1015cd2a4cfdSAnika Henke        }
1016cd2a4cfdSAnika Henke    }
1017b0f23f4eSSatoshi Sahara}
1018