xref: /plugin/siteexport/inc/toc.php (revision 3354083fe485ba9b1f7d8b48477b5cd30854f4d5)
17d101cc1SGerry Weißbach<?php
27d101cc1SGerry Weißbach
37d101cc1SGerry Weißbachif (!defined('DOKU_PLUGIN')) die('meh');
47d101cc1SGerry Weißbach
571925ef6SGerry Weißbachuse dokuwiki\File\PageResolver;
671925ef6SGerry Weißbach
77d101cc1SGerry Weißbachclass siteexport_toc
87d101cc1SGerry Weißbach{
97d101cc1SGerry Weißbach    private $emptyNSToc = true;
107d101cc1SGerry Weißbach    private $functions = null;
11a0726238SGerry Weißbach    private $NS = null;
127d101cc1SGerry Weißbach    public $translation = null;
137d101cc1SGerry Weißbach
14b324a190SMichael Hamann    public function __construct($functions, $NS)
157d101cc1SGerry Weißbach    {
162c9ab2bbSGerry Weißbach        $this->doDebug = !empty($_REQUEST['tocDebug']);
177d101cc1SGerry Weißbach        $this->emptyNSToc = !empty($_REQUEST['emptyTocElem']);
187d101cc1SGerry Weißbach        $this->functions = $functions;
19a0726238SGerry Weißbach        $this->NS = $NS;
207d101cc1SGerry Weißbach    }
217d101cc1SGerry Weißbach
226fcbda1dSGerry Weißbach    private function isNotEmpty( $val ) {
236fcbda1dSGerry Weißbach        return !empty($val);
246fcbda1dSGerry Weißbach    }
256fcbda1dSGerry Weißbach
267d101cc1SGerry Weißbach    private function shortenByTranslation(&$inputURL, $deepSearch = false)
277d101cc1SGerry Weißbach    {
2827464f82SGerry Weißbach        // Mandatory: we allways want '/' insteadf of ':' here
2927464f82SGerry Weißbach        $inputURL = str_replace(':', '/', $inputURL);
30a8c17ab5Si-net /// software
31a8c17ab5Si-net /// software        $checkArray = $this->translation ? $this->translation->translations : array(noNS($this->NS));
32a0726238SGerry Weißbach
337d101cc1SGerry Weißbach        $url = explode('/', $inputURL);
347d101cc1SGerry Weißbach
35cbb6b50eSi-net /// software        $URLcount = count($url);
36cbb6b50eSi-net /// software        for ($i = 0; $i < $URLcount ; $i++)
377d101cc1SGerry Weißbach        {
38a0726238SGerry Weißbach            if (in_array($url[$i], $checkArray))
397d101cc1SGerry Weißbach            {
407d101cc1SGerry Weißbach                // Rauswerfen und weg
417d101cc1SGerry Weißbach                $url[$i] = '';
427d101cc1SGerry Weißbach                break;
437d101cc1SGerry Weißbach            }
447d101cc1SGerry Weißbach
457d101cc1SGerry Weißbach            if (!$deepSearch)
467d101cc1SGerry Weißbach            {
477d101cc1SGerry Weißbach                break;
487d101cc1SGerry Weißbach            }
497d101cc1SGerry Weißbach
507d101cc1SGerry Weißbach            // Ok, remove anyway
517d101cc1SGerry Weißbach            $url[$i] = '';
527d101cc1SGerry Weißbach        }
537d101cc1SGerry Weißbach
547d101cc1SGerry Weißbach        $inputURL = implode('/', $url);
557d101cc1SGerry Weißbach        $inputURL = preg_replace("$\/+$", "/", $inputURL);
567d101cc1SGerry Weißbach
577d101cc1SGerry Weißbach        if (strlen($inputURL) > 0 && substr($inputURL, 0, 1) == '/')
587d101cc1SGerry Weißbach        {
597d101cc1SGerry Weißbach            $inputURL = substr($inputURL, 1);
607d101cc1SGerry Weißbach        }
617d101cc1SGerry Weißbach
627d101cc1SGerry Weißbach        return $inputURL;
637d101cc1SGerry Weißbach    }
647d101cc1SGerry Weißbach
657d101cc1SGerry Weißbach    /**
667d101cc1SGerry Weißbach     * Build the Java Documentation TOC XML
677d101cc1SGerry Weißbach     **/
687d101cc1SGerry Weißbach    public function __getJavaHelpTOCXML($DATA) {
697d101cc1SGerry Weißbach
707d101cc1SGerry Weißbach        if (count($DATA) == 0) {
717d101cc1SGerry Weißbach            return false;
727d101cc1SGerry Weißbach        }
737d101cc1SGerry Weißbach
74e9b60a63SGerry Weißbach        $this->debug("#### STARTING ####");
757d101cc1SGerry Weißbach        $TOCXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<toc>";
767d101cc1SGerry Weißbach        $MAPXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<map version=\"1.0\">";
777d101cc1SGerry Weißbach
787d101cc1SGerry Weißbach        // Go through the pages
797d101cc1SGerry Weißbach        $CHECKDATA = array();
807d101cc1SGerry Weißbach        $nData = $DATA;
817d101cc1SGerry Weißbach        $DATA = array();
827d101cc1SGerry Weißbach        $check = array();
837d101cc1SGerry Weißbach        $startPageID = null;
847d101cc1SGerry Weißbach
857d101cc1SGerry Weißbach        foreach ( $nData as $elem )
867d101cc1SGerry Weißbach        {
877d101cc1SGerry Weißbach            // Check if available
887d101cc1SGerry Weißbach            $anchor = ( !empty($elem['anchor']) ? '#' . $elem['anchor'] : '' );
89d9cefbd9SGerry Weißbach            $elem['url'] = $this->functions->getSiteName($elem['id'], true); // Override - we need a clean name
907d101cc1SGerry Weißbach            $elem['mapURL'] = $elem['url'];
917d101cc1SGerry Weißbach            $this->shortenByTranslation($elem['url']);
927d101cc1SGerry Weißbach
937d101cc1SGerry Weißbach            // only add an url once
947d101cc1SGerry Weißbach            if ( in_array($elem['url'], $CHECKDATA) ) { continue; }
957d101cc1SGerry Weißbach
96dfb6ef8fSGerry Weißbach            if ( !isset($elem['exists']) ) {
97*3354083fSGerry Weißbach                $elem['exists'] = page_exists( (new PageResolver( $elem['id'] ))->resolveId($elem['id']) );
98dfb6ef8fSGerry Weißbach                $this->functions->debug->message("EXISTS previously not set.", $elem, 1);
99dfb6ef8fSGerry Weißbach            }
100dfb6ef8fSGerry Weißbach
1017d101cc1SGerry Weißbach            // if not there, no map ids will be generated
1028a20a4b4SGerry Weißbach            $elem['mapID'] = intval($elem['exists']) == 1 ? $this->functions->getMapID($elem['id'], $elem['anchor'], $check) : array();
1036fcbda1dSGerry Weißbach            $elem['tags'] = explode(' ', p_get_metadata($elem['id'], 'context tags', true)); // thats from the tag plugin
1046fcbda1dSGerry Weißbach            $elem['tags'] = array_filter($elem['tags'], array($this, 'isNotEmpty'));
1056fcbda1dSGerry Weißbach            $elem['tags'] = array_map(array($this->functions, 'cleanId'), $elem['tags']);
1067d101cc1SGerry Weißbach
1070571ece2SScrutinizer Auto-Fixer            if ( empty($elem['depth']) ) {
1080571ece2SScrutinizer Auto-Fixer                $elem['depth'] = count(explode('/', $elem['url']));
1090571ece2SScrutinizer Auto-Fixer            }
1107d101cc1SGerry Weißbach            $CHECKDATA[] = $elem['url'];
1117d101cc1SGerry Weißbach
1127d101cc1SGerry Weißbach            if ( $startPageID == null )
1137d101cc1SGerry Weißbach            {
1147d101cc1SGerry Weißbach                $startPageID = $elem['mapID'][0];
1157d101cc1SGerry Weißbach            }
1167d101cc1SGerry Weißbach
1176f66113cSGerry Weißbach            if ( empty( $elem['name'] ) || $elem['name'] == noNs($elem['id']) ) {
1186ba764b8SGerry Weißbach                $elem['name'] = $this->functions->getSiteTitle($elem['id']);
119ddfb25f1SGerry Weißbach
120ddfb25f1SGerry Weißbach                if ( is_array($elem['mapID']) && empty( $elem['mapID'] ) ) {
121ddfb25f1SGerry Weißbach                    array_push($elem['mapID'], noNs($elem['id']));
122ddfb25f1SGerry Weißbach                }
123ddfb25f1SGerry Weißbach
124ddfb25f1SGerry Weißbach                $this->debug("no name, get site title " . $elem['name']);
12513aaf300SGerry Weißbach                $this->debug($elem);
1266ba764b8SGerry Weißbach            }
1276ba764b8SGerry Weißbach
1287d101cc1SGerry Weißbach            // Go on building mapXML
1297d101cc1SGerry Weißbach            $this->shortenByTranslation($elem['mapURL'], true); // true to already remove all language stuff - false if not
1307d101cc1SGerry Weißbach            foreach ( $elem['mapID'] as $VIEWID ) {
1316fcbda1dSGerry Weißbach                $MAPXML .= "\n\t<mapID target=\"" . $VIEWID . "\" url=\"" . $elem['mapURL'] . $anchor . "\"/>";
1327d101cc1SGerry Weißbach            }
1337d101cc1SGerry Weißbach
1347d101cc1SGerry Weißbach            $elem['tocNS'] = getNS(cleanID($elem['url']));
1352c9ab2bbSGerry Weißbach            $elem['tocNS'] = $this->shortenByTranslation($elem['tocNS'], true);
1362c9ab2bbSGerry Weißbach            $elem['tocNS'] = strlen($elem['tocNS']) > 0 ? explode('/', $elem['tocNS']) : array();
1376ba764b8SGerry Weißbach            $this->functions->debug->message("This will be the TOC elements data:", $elem, 1);
1387d101cc1SGerry Weißbach
1397d101cc1SGerry Weißbach            $this->__buildTOCTree($DATA, $elem['tocNS'], $elem);
1407d101cc1SGerry Weißbach        }
1417d101cc1SGerry Weißbach
14213aaf300SGerry Weißbach        $this->debug("#### Writing TOC Tree ####");
1437d101cc1SGerry Weißbach        $TOCXML .= $this->__writeTOCTree($DATA) . "\n</toc>";
14413aaf300SGerry Weißbach        $this->debug("#### DONE: Writing TOC Tree ####");
1457d101cc1SGerry Weißbach        $MAPXML .= "\n</map>";
14601a1f586SGerry Weißbach
1472c9ab2bbSGerry Weißbach        $this->debug($DATA);
1482c9ab2bbSGerry Weißbach        $this->debug($TOCXML);
1493bda080dSGerry Weißbach        $this->debug($MAPXML);
1507d101cc1SGerry Weißbach
1517d101cc1SGerry Weißbach        return array($TOCXML, $MAPXML, $startPageID);
1527d101cc1SGerry Weißbach    }
1537d101cc1SGerry Weißbach
1547d101cc1SGerry Weißbach    /**
1557d101cc1SGerry Weißbach     * Prepare the TOC Tree
1567d101cc1SGerry Weißbach     **/
1577d101cc1SGerry Weißbach    private function __buildTOCTree(&$DATA, $currentNSArray, $elemToAdd)
1587d101cc1SGerry Weißbach    {
1597d101cc1SGerry Weißbach        global $conf;
1607d101cc1SGerry Weißbach
1612c9ab2bbSGerry Weißbach        // Actual level
1622c9ab2bbSGerry Weißbach        if (empty($currentNSArray)) {
16324b1b4baSGerry Weißbach            $elemToAdd['isStartPage'] = noNS($elemToAdd['id']) == $conf['start'];
16451917f25SGerry Weißbach            // $key = empty($elemToAdd['name']) || 1==1 ? noNS($elemToAdd['id']) : $elemToAdd['name'];
1650965d97cSGerry Weißbach            $key = noNS($elemToAdd['id']);
1660965d97cSGerry Weißbach            $DATA[$key] = $elemToAdd;
1677d101cc1SGerry Weißbach            return;
1687d101cc1SGerry Weißbach        }
1697d101cc1SGerry Weißbach
1707d101cc1SGerry Weißbach        $currentLevel = array_shift($currentNSArray);
17101a1f586SGerry Weißbach        $nextLevel = &$DATA[$currentLevel];
17201a1f586SGerry Weißbach        if (empty($nextLevel)) {
1732c9ab2bbSGerry Weißbach            $nextLevel = array('pages' => array());
17401a1f586SGerry Weißbach        } else {
17501a1f586SGerry Weißbach            $nextLevel = &$DATA[$currentLevel]['pages'];
1767d101cc1SGerry Weißbach        }
1777d101cc1SGerry Weißbach
17801a1f586SGerry Weißbach        $this->__buildTOCTree($nextLevel, $currentNSArray, $elemToAdd);
1797d101cc1SGerry Weißbach    }
1807d101cc1SGerry Weißbach
1817d101cc1SGerry Weißbach    /**
1827d101cc1SGerry Weißbach     * Create a single TOC Item
1837d101cc1SGerry Weißbach     **/
1847d101cc1SGerry Weißbach    private function __TOCItem($item, $depth, $selfClosed = true)
1857d101cc1SGerry Weißbach    {
18664008c75SGerry Weißbach        $this->debug("creating toc item");
18713aaf300SGerry Weißbach        $this->debug($item);
188de71facaSGerry Weißbach        $targetID = $item['mapID'][0] ?? '';
1897d101cc1SGerry Weißbach        if (empty($targetID)) {
190045da2c8SGerry Weißbach            $targetID = $this->functions->cleanID($item['name']);
19164008c75SGerry Weißbach            $this->debug("no map ID, using: " . $targetID);
1927d101cc1SGerry Weißbach        }
193dbc4346dSGerry Weißbach        return "\n" . str_repeat("\t", max($depth, 0)+1) . "<tocitem target=\"" . $targetID . "\"" . (intval($item['exists']) == 1 ? " text=\"" . $item['name'] . "\"" : "") . ( array_key_exists('tags', $item) && !empty($item['tags']) ? " tags=\"" . implode(' ', $item['tags']) . "\"": "")  . ($selfClosed ? '/' : '') . ">";
1947d101cc1SGerry Weißbach    }
1957d101cc1SGerry Weißbach
1967d101cc1SGerry Weißbach    /**
1977d101cc1SGerry Weißbach     * Create a single TOC Item
1987d101cc1SGerry Weißbach     **/
1997d101cc1SGerry Weißbach    private function __TOCItemClose($depth)
2007d101cc1SGerry Weißbach    {
2017d101cc1SGerry Weißbach        return "\n" . str_repeat("\t", max($depth, 0)+1) . "</tocitem>";
2027d101cc1SGerry Weißbach    }
2037d101cc1SGerry Weißbach
2047d101cc1SGerry Weißbach    /**
2057d101cc1SGerry Weißbach     * Write the whole TOC TREE
2067d101cc1SGerry Weißbach     **/
2077d101cc1SGerry Weißbach    private function __writeTOCTree($CURRENTNODE, $CURRENTNODENAME = null, $DEPTH = 0) {
2087d101cc1SGerry Weißbach        global $conf;
2097d101cc1SGerry Weißbach
2107d101cc1SGerry Weißbach        $XML = '';
2117d101cc1SGerry Weißbach        $didOpenItem = false;
2127d101cc1SGerry Weißbach        if (!is_array($CURRENTNODE) || empty($CURRENTNODE))
2137d101cc1SGerry Weißbach        {
2147d101cc1SGerry Weißbach            // errr … no.
2157d101cc1SGerry Weißbach            return $XML;
2167d101cc1SGerry Weißbach        }
2177d101cc1SGerry Weißbach
2187d101cc1SGerry Weißbach        // This is an element!
219f3b52d8fSGerry Weißbach        if (!empty($CURRENTNODE['id']) && empty($CURRENTNODE['pages']))
2207d101cc1SGerry Weißbach        {
221f3b52d8fSGerry Weißbach            // This has to be an item - only -!
2227d101cc1SGerry Weißbach            return $this->__TOCItem($CURRENTNODE, $DEPTH);
2237d101cc1SGerry Weißbach        }
2247d101cc1SGerry Weißbach
2257d101cc1SGerry Weißbach        // Look for start page
2267d101cc1SGerry Weißbach        if (!empty($CURRENTNODE[$conf['start']]))
2277d101cc1SGerry Weißbach        {
2287d101cc1SGerry Weißbach            // YAY! StartPage found.
22901a1f586SGerry Weißbach            $didOpenItem = !(count(empty($CURRENTNODE['pages']) ? $CURRENTNODE : $CURRENTNODE['pages']) == 0);
2307d101cc1SGerry Weißbach            $XML .= $this->__TOCItem($CURRENTNODE[$conf['start']], $DEPTH, !$didOpenItem);
2317d101cc1SGerry Weißbach            unset($CURRENTNODE[$conf['start']]);
23201a1f586SGerry Weißbach        } else if (!empty($CURRENTNODE['element'])) {
23301a1f586SGerry Weißbach            $didOpenItem = !(count($CURRENTNODE['pages']) == 0);
23401a1f586SGerry Weißbach            $XML .= $this->__TOCItem($CURRENTNODE['element'], $DEPTH, !$didOpenItem);
23501a1f586SGerry Weißbach            unset($CURRENTNODE['element']);
2367d101cc1SGerry Weißbach        } else if ($CURRENTNODENAME != null) {
2377d101cc1SGerry Weißbach            // We have a parent node for what is comming … lets honor that
2387d101cc1SGerry Weißbach            $didOpenItem = !(count($CURRENTNODE) == 0);
23964008c75SGerry Weißbach            $XML .= $this->__TOCItem(array('name' => $CURRENTNODENAME), $DEPTH, !$didOpenItem);
2407d101cc1SGerry Weißbach        } else {
2417d101cc1SGerry Weißbach            // Woohoo … empty node? do not count up!
2427d101cc1SGerry Weißbach            $DEPTH--;
2437d101cc1SGerry Weißbach        }
2447d101cc1SGerry Weißbach
2453bda080dSGerry Weißbach        $this->debug("-- This is the current node --");
2463bda080dSGerry Weißbach        $this->debug($CURRENTNODE);
2473bda080dSGerry Weißbach
2487d101cc1SGerry Weißbach        // Circle through the entries
24901a1f586SGerry Weißbach        foreach (empty($CURRENTNODE['pages']) ? $CURRENTNODE : $CURRENTNODE['pages'] as $NODENAME => $ELEM)
2507d101cc1SGerry Weißbach        {
2517d101cc1SGerry Weißbach            // a node should have more than only one entry … otherwise we will not tell our name!
25213aaf300SGerry Weißbach            $XML .= $this->__writeTOCTree($ELEM, count($ELEM) >= 1 ? ( !empty($ELEM['name']) ? $ELEM['name'] : $NODENAME ) : null, $DEPTH+1);
2537d101cc1SGerry Weißbach        }
2547d101cc1SGerry Weißbach
2557d101cc1SGerry Weißbach        // Close and return
2567d101cc1SGerry Weißbach        return $XML . ($didOpenItem ? $this->__TOCItemClose($DEPTH) : '');
2577d101cc1SGerry Weißbach    }
2587d101cc1SGerry Weißbach
2597d101cc1SGerry Weißbach    /**
2607d101cc1SGerry Weißbach     * Build the Eclipse Documentation TOC XML
2617d101cc1SGerry Weißbach     **/
2627d101cc1SGerry Weißbach    public function __getTOCXML($DATA, $XML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?NLS TYPE=\"org.eclipse.help.toc\"?>\n") {
2637d101cc1SGerry Weißbach
2647d101cc1SGerry Weißbach        $pagesArray = array();
2657d101cc1SGerry Weißbach
2667d101cc1SGerry Weißbach        // Go through the pages
2677d101cc1SGerry Weißbach        foreach ($DATA as $elem) {
2687d101cc1SGerry Weißbach
2697d101cc1SGerry Weißbach            $site = $elem['id'];
2707d101cc1SGerry Weißbach            $elems = explode('/', $this->functions->getSiteName($site));
2717d101cc1SGerry Weißbach
2727d101cc1SGerry Weißbach            // Strip Site
2737d101cc1SGerry Weißbach            array_pop($elems);
2747d101cc1SGerry Weißbach
2757d101cc1SGerry Weißbach            // build the topic Tree
2767d101cc1SGerry Weißbach            $this->__buildTopicTree($pagesArray, $elems, $site);
2777d101cc1SGerry Weißbach        }
2787d101cc1SGerry Weißbach
2797d101cc1SGerry Weißbach        $XML .= $this->__addXMLTopic($pagesArray, 'toc');
2807d101cc1SGerry Weißbach
2817d101cc1SGerry Weißbach        return $XML;
2827d101cc1SGerry Weißbach
2837d101cc1SGerry Weißbach    }
2847d101cc1SGerry Weißbach
2857d101cc1SGerry Weißbach    /**
2867d101cc1SGerry Weißbach     * Load the topic Tree for the TOC - recursive
2877d101cc1SGerry Weißbach     **/
2887d101cc1SGerry Weißbach    private function __buildTopicTree(&$PAGES, $DATA, $SITE, $INSERTDATA = null) {
2897d101cc1SGerry Weißbach
2907d101cc1SGerry Weißbach        if (empty($DATA) || !is_array($DATA)) {
2917d101cc1SGerry Weißbach
2927d101cc1SGerry Weißbach            if ($INSERTDATA == null)
2937d101cc1SGerry Weißbach            {
2947d101cc1SGerry Weißbach                $INSERTDATA = $SITE;
2957d101cc1SGerry Weißbach            }
2967d101cc1SGerry Weißbach
2977d101cc1SGerry Weißbach            // This is already a namespace
2987d101cc1SGerry Weißbach            if (is_array($PAGES[noNS($SITE)])) {
2997d101cc1SGerry Weißbach                // The root already exists!
3007d101cc1SGerry Weißbach                if (!empty($PAGES[noNS($SITE)][noNS($SITE)])) {
3017d101cc1SGerry Weißbach                    if (strstr($PAGES[noNS($SITE)][noNS($SITE)], $SITE)) {
3027d101cc1SGerry Weißbach                        // The SITE is in the parent Namespace, and the current Namespace has an index with same name
3037d101cc1SGerry Weißbach                        $PAGES['__' . noNS($SITE)] = $INSERTDATA;
3047d101cc1SGerry Weißbach                    } else {
3057d101cc1SGerry Weißbach                        $PAGES['__' . noNS($SITE)] = $PAGES[noNS($SITE)][noNS($SITE)];
3067d101cc1SGerry Weißbach                        $PAGES[noNS($SITE)][noNS($SITE)] = $INSERTDATA;
3077d101cc1SGerry Weißbach                    }
3087d101cc1SGerry Weißbach                } else {
3097d101cc1SGerry Weißbach                    $PAGES[noNS($SITE)][noNS($SITE)] = $INSERTDATA;
3107d101cc1SGerry Weißbach                }
3117d101cc1SGerry Weißbach            } else {
3127d101cc1SGerry Weißbach                // just a Page
3137d101cc1SGerry Weißbach                $PAGES[noNS($SITE)] = $INSERTDATA;
3147d101cc1SGerry Weißbach            }
3157d101cc1SGerry Weißbach            return;
3167d101cc1SGerry Weißbach        }
3177d101cc1SGerry Weißbach
3187d101cc1SGerry Weißbach        $NS = array_shift($DATA);
3197d101cc1SGerry Weißbach        if (!is_array($PAGES[$NS])) $PAGES[$NS] = empty($PAGES[$NS]) ? array() : array($PAGES[$NS]);
3207d101cc1SGerry Weißbach        $this->__buildTopicTree($PAGES[$NS], $DATA, $SITE, $INSERTDATA);
3217d101cc1SGerry Weißbach
3227d101cc1SGerry Weißbach        return;
3237d101cc1SGerry Weißbach    }
3247d101cc1SGerry Weißbach
3257d101cc1SGerry Weißbach    /**
3267d101cc1SGerry Weißbach     * Build the Topic Tree for TOC.xml
3277d101cc1SGerry Weißbach     **/
3287d101cc1SGerry Weißbach    private function __addXMLTopic($DATA, $ITEM = 'topic', $LEVEL = 0, $NODENAME = '') {
3297d101cc1SGerry Weißbach        global $conf;
3307d101cc1SGerry Weißbach
3317d101cc1SGerry Weißbach        $DEPTH = str_repeat("\t", $LEVEL);
3327d101cc1SGerry Weißbach
3337d101cc1SGerry Weißbach        if (!is_array($DATA)) {
3347d101cc1SGerry Weißbach            return $DEPTH . '<' . $ITEM . ' label="' . $this->functions->getSiteTitle($DATA) . '" ' . ($ITEM != 'topic' ? 'topic' : 'href') . '="' . $this->functions->getSiteName($DATA) . "\" />\n";
3357d101cc1SGerry Weißbach        }
3367d101cc1SGerry Weißbach        // Is array from this point on
3377d101cc1SGerry Weißbach        list($indexTitle, $indexFile) = $this->__getIndexItem($DATA, $NODENAME);
3387d101cc1SGerry Weißbach
3397d101cc1SGerry Weißbach        if (empty($indexTitle)) $indexTitle = $this->functions->getSiteTitle($conf['start']);
3407d101cc1SGerry Weißbach        if (!empty($indexFile)) $indexFile = ($ITEM != 'topic' ? 'topic' : 'href') . "=\"$indexFile\"";
3417d101cc1SGerry Weißbach
3427d101cc1SGerry Weißbach        $isEmptyNode = count($DATA) == 1 && empty($indexFile);
3437d101cc1SGerry Weißbach
344a8c17ab5Si-net /// software        if (!$isEmptyNode && ($this->emptyNSToc || count($DATA) > 0)) {
3457d101cc1SGerry Weißbach            $XML = "$DEPTH<$ITEM label=\"$indexTitle\" $indexFile>";
346a8c17ab5Si-net /// software        } else {
347a8c17ab5Si-net /// software            $XML = "";
348a8c17ab5Si-net /// software        }
3497d101cc1SGerry Weißbach
3507d101cc1SGerry Weißbach        if (!$isEmptyNode && count($DATA) > 0) $XML .= "\n";
3517d101cc1SGerry Weißbach
3527d101cc1SGerry Weißbach        foreach ($DATA as $NODENAME => $NS) {
3537d101cc1SGerry Weißbach            $XML .= $this->__addXMLTopic($NS, (!($this->emptyNSToc || count($DATA) > 1) && $ITEM != 'topic' ? $ITEM : 'topic'), $LEVEL+(!$isEmptyNode ? 1 : 0), $NODENAME);
3547d101cc1SGerry Weißbach        }
3557d101cc1SGerry Weißbach
3567d101cc1SGerry Weißbach        if (!$isEmptyNode && count($DATA) > 0) $XML .= "$DEPTH";
3577d101cc1SGerry Weißbach        if (!$isEmptyNode && ($this->emptyNSToc || count($DATA) > 0)) {
3587d101cc1SGerry Weißbach            $XML .= "</$ITEM>\n";
3597d101cc1SGerry Weißbach        }
3607d101cc1SGerry Weißbach
3617d101cc1SGerry Weißbach        return $XML;
3627d101cc1SGerry Weißbach    }
3637d101cc1SGerry Weißbach
3647d101cc1SGerry Weißbach
3657d101cc1SGerry Weißbach    /**
3667d101cc1SGerry Weißbach     * Get the context XML
3677d101cc1SGerry Weißbach     **/
3687d101cc1SGerry Weißbach    public function __getContextXML($DATA) {
3697d101cc1SGerry Weißbach
3707d101cc1SGerry Weißbach        $XML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?NLS TYPE=\"org.eclipse.help.context\"?>\n<contexts>\n";
3717d101cc1SGerry Weißbach
3727d101cc1SGerry Weißbach        $check = array();
3737d101cc1SGerry Weißbach        foreach ($DATA as $elem)
3747d101cc1SGerry Weißbach        {
3757d101cc1SGerry Weißbach            $ID = $elem['id'];
3767d101cc1SGerry Weißbach            $meta = p_get_metadata($ID, 'context', true);
3777d101cc1SGerry Weißbach            if (empty($meta['id'])) { continue; }
3787d101cc1SGerry Weißbach
3797d101cc1SGerry Weißbach            $TITLE = empty($meta['title']) ? $this->functions->getSiteTitle($ID) : $meta['title'];
3807d101cc1SGerry Weißbach
3817d101cc1SGerry Weißbach            // support more than one view IDs ... for more than one reference
3828a20a4b4SGerry Weißbach            $VIEWIDs = $this->functions->getMapID($elem['id'], $elem['anchor'], $check);
3837d101cc1SGerry Weißbach
3847d101cc1SGerry Weißbach            $DESCRIPTION = $this->functions->xmlEntities(p_get_metadata($ID, 'description abstract'));
3857d101cc1SGerry Weißbach
3867d101cc1SGerry Weißbach            // Build topic Links
3877d101cc1SGerry Weißbach            $url = $this->functions->getSiteName($ID);
3887d101cc1SGerry Weißbach            $this->shortenByTranslation($url);
3897d101cc1SGerry Weißbach
3907d101cc1SGerry Weißbach            $TOPICS = array($url => $TITLE . " (Details)");
3917d101cc1SGerry Weißbach            $REFS = p_get_metadata($ID, 'relation references', true);
3927d101cc1SGerry Weißbach            if (is_array($REFS))
3937d101cc1SGerry Weißbach            foreach ($REFS as $REL => $EXISTS) {
3947d101cc1SGerry Weißbach                if (!$EXISTS) { continue; }
3957d101cc1SGerry Weißbach                $TOPICS[$this->functions->getSiteName($REL)] = $this->functions->getSiteTitle($REL);
3967d101cc1SGerry Weißbach            }
3977d101cc1SGerry Weißbach
3987d101cc1SGerry Weißbach            // build XML - include multi view IDs
3997d101cc1SGerry Weißbach            foreach ($VIEWIDs as $VIEWID) {
4007d101cc1SGerry Weißbach                $XML .= "\t<context id=\"$VIEWID\" title=\"$TITLE\">\n";
4017d101cc1SGerry Weißbach                $XML .= "\t\t<description>$DESCRIPTION</description>\n";
4027d101cc1SGerry Weißbach
4037d101cc1SGerry Weißbach                foreach ($TOPICS as $URL => $LABEL) {
4047d101cc1SGerry Weißbach                    $XML .= "\t\t<topic label=\"$LABEL\" href=\"$URL\" />\n";
4057d101cc1SGerry Weißbach                }
4067d101cc1SGerry Weißbach
4077d101cc1SGerry Weißbach                $XML .= "\t</context>\n";
4087d101cc1SGerry Weißbach            }
4097d101cc1SGerry Weißbach        }
4107d101cc1SGerry Weißbach
4117d101cc1SGerry Weißbach        $XML .= "</contexts>";
4127d101cc1SGerry Weißbach        return $XML;
4137d101cc1SGerry Weißbach
4147d101cc1SGerry Weißbach    }
4157d101cc1SGerry Weißbach
4167d101cc1SGerry Weißbach    /**
4177d101cc1SGerry Weißbach     * Determine if this is an index - and if so, find its Title
4187d101cc1SGerry Weißbach     **/
4197d101cc1SGerry Weißbach    private function __getIndexItem(&$DATA, $NODENAME = '') {
4207d101cc1SGerry Weißbach        global $conf;
4217d101cc1SGerry Weißbach
4227d101cc1SGerry Weißbach        if (!is_array($DATA)) { return; }
4237d101cc1SGerry Weißbach
4247d101cc1SGerry Weißbach        $indexTitle = '';
4257d101cc1SGerry Weißbach        $indexFile = '';
4267d101cc1SGerry Weißbach        foreach ($DATA as $NODE => $indexSearch) {
4277d101cc1SGerry Weißbach            // Skip next Namespaces
4287d101cc1SGerry Weißbach            if (is_array($indexSearch)) { continue; }
4297d101cc1SGerry Weißbach
4307d101cc1SGerry Weißbach            // Skip if this is not a start
4317d101cc1SGerry Weißbach            if ($NODE != $conf['start']) { continue; }
4327d101cc1SGerry Weißbach
4337d101cc1SGerry Weißbach            $indexTitle = $this->functions->getSiteTitle($indexSearch);
4347d101cc1SGerry Weißbach            $indexFile = $indexSearch;
4357d101cc1SGerry Weißbach            unset($DATA[$NODE]);
4367d101cc1SGerry Weißbach            break;
4377d101cc1SGerry Weißbach        }
4387d101cc1SGerry Weißbach
4397d101cc1SGerry Weißbach        if (empty($indexFile) && !empty($DATA[$NODENAME])) {
4407d101cc1SGerry Weißbach            $indexTitle = $this->functions->getSiteTitle($DATA[$NODENAME]);
4417d101cc1SGerry Weißbach            $indexFile = $DATA[$NODENAME];
4427d101cc1SGerry Weißbach            unset($DATA[$NODENAME]);
4437d101cc1SGerry Weißbach        }
4447d101cc1SGerry Weißbach
4457d101cc1SGerry Weißbach        return array($indexTitle, $this->functions->getSiteName($indexFile));
4467d101cc1SGerry Weißbach    }
4472c9ab2bbSGerry Weißbach
4482c9ab2bbSGerry Weißbach    private $doDebug = false;
4492c9ab2bbSGerry Weißbach    private static $didDebug = false;
4503bda080dSGerry Weißbach    public function debug($data, $final = false) {
4512c9ab2bbSGerry Weißbach        if ( ! $this->doDebug ) { return; }
4522c9ab2bbSGerry Weißbach
4532c9ab2bbSGerry Weißbach        if ( !$this->didDebug ) {
4542c9ab2bbSGerry Weißbach            print "<html><pre>";
4552c9ab2bbSGerry Weißbach            $this->didDebug = true;
4567d101cc1SGerry Weißbach        }
4577d101cc1SGerry Weißbach
4582c9ab2bbSGerry Weißbach        if ( is_array($data) ) {
4592c9ab2bbSGerry Weißbach            print_r($data);
4602c9ab2bbSGerry Weißbach        } else {
4612c9ab2bbSGerry Weißbach            print str_replace("<", "&lt;", str_replace(">", "&gt;", $data));;
4622c9ab2bbSGerry Weißbach        }
4632c9ab2bbSGerry Weißbach
4642c9ab2bbSGerry Weißbach        print "\n\n";
4652c9ab2bbSGerry Weißbach
4662c9ab2bbSGerry Weißbach        if ( $final ) {
4672c9ab2bbSGerry Weißbach            print "</pre></html>";
4682c9ab2bbSGerry Weißbach            exit;
4692c9ab2bbSGerry Weißbach        }
4702c9ab2bbSGerry Weißbach    }
4712c9ab2bbSGerry Weißbach}
472