xref: /plugin/siteexport/inc/toc.php (revision 45360772548103ae0d561c61ad3b719ef56fd342)
17d101cc1SGerry Weißbach<?php
27d101cc1SGerry Weißbach
37d101cc1SGerry Weißbachif(!defined('DOKU_PLUGIN')) die('meh');
47d101cc1SGerry Weißbach
57d101cc1SGerry Weißbachclass siteexport_toc
67d101cc1SGerry Weißbach{
77d101cc1SGerry Weißbach    private $emptyNSToc = true;
87d101cc1SGerry Weißbach    private $functions = null;
97d101cc1SGerry Weißbach    public $translation = null;
107d101cc1SGerry Weißbach
117d101cc1SGerry Weißbach    public function siteexport_toc($functions)
127d101cc1SGerry Weißbach    {
137d101cc1SGerry Weißbach        $this->emptyNSToc = !empty($_REQUEST['emptyTocElem']);
147d101cc1SGerry Weißbach        $this->functions = $functions;
157d101cc1SGerry Weißbach    }
167d101cc1SGerry Weißbach
177d101cc1SGerry Weißbach    private function shortenByTranslation(&$inputURL, $deepSearch = false)
187d101cc1SGerry Weißbach    {
1927464f82SGerry Weißbach        // Mandatory: we allways want '/' insteadf of ':' here
2027464f82SGerry Weißbach        $inputURL = str_replace(':', '/', $inputURL);
217d101cc1SGerry Weißbach        if ( $this->translation )
227d101cc1SGerry Weißbach        {
237d101cc1SGerry Weißbach            $url = explode('/', $inputURL);
247d101cc1SGerry Weißbach
257d101cc1SGerry Weißbach            for( $i=0; $i<count($url); $i++ )
267d101cc1SGerry Weißbach            {
277d101cc1SGerry Weißbach                if ( in_array($url[$i], $this->translation->trans ) )
287d101cc1SGerry Weißbach                {
297d101cc1SGerry Weißbach                    // Rauswerfen und weg
307d101cc1SGerry Weißbach                    $url[$i] = '';
317d101cc1SGerry Weißbach                    break;
327d101cc1SGerry Weißbach                }
337d101cc1SGerry Weißbach
347d101cc1SGerry Weißbach                if ( !$deepSearch )
357d101cc1SGerry Weißbach                {
367d101cc1SGerry Weißbach                    break;
377d101cc1SGerry Weißbach                }
387d101cc1SGerry Weißbach
397d101cc1SGerry Weißbach                // Ok, remove anyway
407d101cc1SGerry Weißbach                $url[$i] = '';
417d101cc1SGerry Weißbach            }
427d101cc1SGerry Weißbach
437d101cc1SGerry Weißbach            $inputURL = implode('/', $url);
447d101cc1SGerry Weißbach            $inputURL = preg_replace("$\/+$", "/", $inputURL);
457d101cc1SGerry Weißbach        }
467d101cc1SGerry Weißbach
477d101cc1SGerry Weißbach        if ( strlen($inputURL) > 0 && substr($inputURL, 0, 1) == '/' )
487d101cc1SGerry Weißbach        {
497d101cc1SGerry Weißbach            $inputURL = substr($inputURL, 1);
507d101cc1SGerry Weißbach        }
517d101cc1SGerry Weißbach
527d101cc1SGerry Weißbach        return $inputURL;
537d101cc1SGerry Weißbach    }
547d101cc1SGerry Weißbach
557d101cc1SGerry Weißbach    /**
567d101cc1SGerry Weißbach     * Build the Java Documentation TOC XML
577d101cc1SGerry Weißbach     **/
587d101cc1SGerry Weißbach    public function __getJavaHelpTOCXML($DATA) {
597d101cc1SGerry Weißbach
607d101cc1SGerry Weißbach        if ( count ( $DATA) == 0 ) {
617d101cc1SGerry Weißbach            return false;
627d101cc1SGerry Weißbach        }
637d101cc1SGerry Weißbach
647d101cc1SGerry Weißbach        $TOCXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<toc>";
657d101cc1SGerry Weißbach        $MAPXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<map version=\"1.0\">";
667d101cc1SGerry Weißbach        // usort($DATA, array($this, 'sortFunction'));
677d101cc1SGerry Weißbach
687d101cc1SGerry Weißbach        // Go through the pages
697d101cc1SGerry Weißbach        $CHECKDATA = array();
707d101cc1SGerry Weißbach        $nData = $DATA;
717d101cc1SGerry Weißbach        $DATA = array();
727d101cc1SGerry Weißbach        $check = array();
737d101cc1SGerry Weißbach        $startPageID = null;
747d101cc1SGerry Weißbach
757d101cc1SGerry Weißbach        foreach ( $nData as $elem )
767d101cc1SGerry Weißbach        {
777d101cc1SGerry Weißbach			// Check if available
787d101cc1SGerry Weißbach            $anchor = ( !empty($elem['anchor']) ? '#' . $elem['anchor'] : '' );
79d9cefbd9SGerry Weißbach            $elem['url'] = $this->functions->getSiteName($elem['id'], true); // Override - we need a clean name
807d101cc1SGerry Weißbach            $elem['mapURL'] = $elem['url'];
817d101cc1SGerry Weißbach            $this->shortenByTranslation($elem['url']);
827d101cc1SGerry Weißbach
837d101cc1SGerry Weißbach            // only add an url once
847d101cc1SGerry Weißbach            if ( in_array($elem['url'], $CHECKDATA) ) { continue; }
857d101cc1SGerry Weißbach
86dfb6ef8fSGerry Weißbach            if ( !isset($elem['exists']) ) {
87dfb6ef8fSGerry Weißbach                resolve_pageid(getNS($elem['id']),$elem['id'],$elem['exists']);
88dfb6ef8fSGerry Weißbach                $this->functions->debug->message("EXISTS previously not set.", $elem, 1);
89dfb6ef8fSGerry Weißbach            }
90dfb6ef8fSGerry Weißbach
917d101cc1SGerry Weißbach			// if not there, no map ids will be generated
927d101cc1SGerry Weißbach            $elem['mapID'] = intval($elem['exists']) == 1 ? $this->getMapID($elem, $check) : array();
937d101cc1SGerry Weißbach
947d101cc1SGerry Weißbach            if ( empty($elem['depth']) ) $elem['depth'] = count(explode('/', $elem['url']));
957d101cc1SGerry Weißbach            $CHECKDATA[] = $elem['url'];
967d101cc1SGerry Weißbach
977d101cc1SGerry Weißbach            if ( $startPageID == null )
987d101cc1SGerry Weißbach            {
997d101cc1SGerry Weißbach                $startPageID = $elem['mapID'][0];
1007d101cc1SGerry Weißbach            }
1017d101cc1SGerry Weißbach
1026f66113cSGerry Weißbach            if ( empty( $elem['name'] ) || $elem['name'] == noNs($elem['id']) ) {
1036ba764b8SGerry Weißbach	            $elem['name'] = $this->functions->getSiteTitle($elem['id']);
1046ba764b8SGerry Weißbach            }
1056ba764b8SGerry Weißbach
1067d101cc1SGerry Weißbach            // Go on building mapXML
1077d101cc1SGerry Weißbach            $this->shortenByTranslation($elem['mapURL'], true); // true to already remove all language stuff - false if not
1087d101cc1SGerry Weißbach            foreach ( $elem['mapID'] as $VIEWID ) {
1097d101cc1SGerry Weißbach                $MAPXML .= "\n\t<mapID target=\"$VIEWID\" url=\"" . $elem['mapURL'] . $anchor . "\"/>";
1107d101cc1SGerry Weißbach            }
1117d101cc1SGerry Weißbach
1127d101cc1SGerry Weißbach            $elem['tocNS'] = getNS(cleanID($elem['url']));
1137d101cc1SGerry Weißbach            $elem['tocNS'] = explode('/', $this->shortenByTranslation($elem['tocNS'], true));
1146ba764b8SGerry Weißbach            $this->functions->debug->message("This will be the TOC elements data:", $elem, 1);
1157d101cc1SGerry Weißbach
1167d101cc1SGerry Weißbach            $this->__buildTOCTree($DATA, $elem['tocNS'], $elem);
1177d101cc1SGerry Weißbach        }
1187d101cc1SGerry Weißbach
1197d101cc1SGerry Weißbach        $TOCXML .= $this->__writeTOCTree($DATA) . "\n</toc>";
1207d101cc1SGerry Weißbach        $MAPXML .= "\n</map>";
1217d101cc1SGerry Weißbach/*
12272571f03SGerry Weißbach//*
1237d101cc1SGerry Weißbach        // http://documentation:81/documentation/clear-reports/remote-interface-help/configuration/configuration/index?JavaHelpDocZip=1&depthType=1&diInv=1&do=siteexport&ens=documentation%3Aclear-reports%3Aremote-interface-help%3Aconfiguration&renderer=&template=clearreports-setup&useTocFile=1
1247d101cc1SGerry Weißbach        print "<html><pre>";
1257d101cc1SGerry Weißbach        print_r($DATA);
1267d101cc1SGerry Weißbach        $TOCXML = str_replace("<", "&lt;", str_replace(">", "&gt;", $TOCXML));
1277d101cc1SGerry Weißbach        print "$TOCXML";
1287d101cc1SGerry Weißbach
1297d101cc1SGerry Weißbach        $MAPXML = str_replace("<", "&lt;", str_replace(">", "&gt;", $MAPXML));
1307d101cc1SGerry Weißbach        print "$MAPXML";
1317d101cc1SGerry Weißbach
1327d101cc1SGerry Weißbach        print "</pre></html>";
1337d101cc1SGerry Weißbach        exit;
1347d101cc1SGerry Weißbach/*/
1357d101cc1SGerry Weißbach        return array($TOCXML, $MAPXML, $startPageID);
1367d101cc1SGerry Weißbach//*/
1377d101cc1SGerry Weißbach    }
1387d101cc1SGerry Weißbach
1397d101cc1SGerry Weißbach    /**
1407d101cc1SGerry Weißbach     * Prepare the TOC Tree
1417d101cc1SGerry Weißbach     **/
1427d101cc1SGerry Weißbach    private function __buildTOCTree(&$DATA, $currentNSArray, $elemToAdd)
1437d101cc1SGerry Weißbach    {
1447d101cc1SGerry Weißbach        global $conf;
1457d101cc1SGerry Weißbach
1467d101cc1SGerry Weißbach        if ( empty($currentNSArray) )
1477d101cc1SGerry Weißbach        {
1487d101cc1SGerry Weißbach            // In Depth, let go!
1497d101cc1SGerry Weißbach            $DATA[noNS($elemToAdd['id'])] = $elemToAdd;
1507d101cc1SGerry Weißbach            return;
1517d101cc1SGerry Weißbach        } else if (count($currentNSArray) == 1 && $currentNSArray[0] == '' && noNS($elemToAdd['id']) == $conf['start'] )
1527d101cc1SGerry Weißbach        {
1537d101cc1SGerry Weißbach            // Wird gebraucht um die erste Ebene sauber zu bauen … kann aber irgendwelche Nebeneffekte haben
1547d101cc1SGerry Weißbach            $DATA[noNS($elemToAdd['id'])] = $elemToAdd;
1557d101cc1SGerry Weißbach            return;
1567d101cc1SGerry Weißbach        }
1577d101cc1SGerry Weißbach
1587d101cc1SGerry Weißbach        $currentLevel = array_shift($currentNSArray);
1597d101cc1SGerry Weißbach        if ( empty($DATA[$currentLevel]) ) {
1607d101cc1SGerry Weißbach            $DATA[$currentLevel] = array();
1617d101cc1SGerry Weißbach        }
1627d101cc1SGerry Weißbach
1637d101cc1SGerry Weißbach        $this->__buildTOCTree($DATA[$currentLevel], $currentNSArray, $elemToAdd);
1647d101cc1SGerry Weißbach    }
1657d101cc1SGerry Weißbach
1667d101cc1SGerry Weißbach    /**
1677d101cc1SGerry Weißbach     * Create a single TOC Item
1687d101cc1SGerry Weißbach     **/
1697d101cc1SGerry Weißbach    private function __TOCItem($item, $depth, $selfClosed=true)
1707d101cc1SGerry Weißbach    {
1717d101cc1SGerry Weißbach        $targetID = $item['mapID'][0];
1727d101cc1SGerry Weißbach        if ( empty($targetID) ) {
1737d101cc1SGerry Weißbach            $targetID = strtolower($item['name']);
1747d101cc1SGerry Weißbach        }
1757d101cc1SGerry Weißbach        return "\n" . str_repeat("\t", max($depth, 0)+1) . "<tocitem target=\"$targetID\"" . (intval($item['exists']) == 1 ? " text=\"" . $item['name'] . "\"" : "") . ($selfClosed?'/':'') . ">";
1767d101cc1SGerry Weißbach    }
1777d101cc1SGerry Weißbach
1787d101cc1SGerry Weißbach    /**
1797d101cc1SGerry Weißbach     * Create a single TOC Item
1807d101cc1SGerry Weißbach     **/
1817d101cc1SGerry Weißbach    private function __TOCItemClose($depth)
1827d101cc1SGerry Weißbach    {
1837d101cc1SGerry Weißbach        return "\n" . str_repeat("\t", max($depth, 0)+1) . "</tocitem>";
1847d101cc1SGerry Weißbach    }
1857d101cc1SGerry Weißbach
1867d101cc1SGerry Weißbach    /**
1877d101cc1SGerry Weißbach     * Write the whole TOC TREE
1887d101cc1SGerry Weißbach     **/
1897d101cc1SGerry Weißbach    private function __writeTOCTree($CURRENTNODE, $CURRENTNODENAME = null, $DEPTH=0) {
1907d101cc1SGerry Weißbach        global $conf;
1917d101cc1SGerry Weißbach
1927d101cc1SGerry Weißbach        $XML = '';
1937d101cc1SGerry Weißbach        $didOpenItem = false;
1947d101cc1SGerry Weißbach        if ( !is_array($CURRENTNODE) || empty($CURRENTNODE) )
1957d101cc1SGerry Weißbach        {
1967d101cc1SGerry Weißbach            // errr … no.
1977d101cc1SGerry Weißbach            return $XML;
1987d101cc1SGerry Weißbach        }
1997d101cc1SGerry Weißbach
2007d101cc1SGerry Weißbach        // This is an element!
2017d101cc1SGerry Weißbach        if ( !empty($CURRENTNODE['id']) )
2027d101cc1SGerry Weißbach        {
2037d101cc1SGerry Weißbach            // This has to be an item!
2047d101cc1SGerry Weißbach            return $this->__TOCItem($CURRENTNODE, $DEPTH);
2057d101cc1SGerry Weißbach        }
2067d101cc1SGerry Weißbach
2077d101cc1SGerry Weißbach        // Look for start page
2087d101cc1SGerry Weißbach        if ( !empty($CURRENTNODE[$conf['start']]) )
2097d101cc1SGerry Weißbach        {
2107d101cc1SGerry Weißbach            // YAY! StartPage found.
2117d101cc1SGerry Weißbach            $didOpenItem = !(count($CURRENTNODE) == 1);
2127d101cc1SGerry Weißbach            $XML .= $this->__TOCItem($CURRENTNODE[$conf['start']], $DEPTH, !$didOpenItem );
2137d101cc1SGerry Weißbach            unset($CURRENTNODE[$conf['start']]);
2147d101cc1SGerry Weißbach        } else if ($CURRENTNODENAME != null) {
2157d101cc1SGerry Weißbach            // We have a parent node for what is comming … lets honor that
2167d101cc1SGerry Weißbach            $didOpenItem = !(count($CURRENTNODE) == 0);
2177d101cc1SGerry Weißbach            $XML .= $this->__TOCItem(array('name' => ucwords($CURRENTNODENAME)), $DEPTH, !$didOpenItem );
2187d101cc1SGerry Weißbach        } else {
2197d101cc1SGerry Weißbach            // Woohoo … empty node? do not count up!
2207d101cc1SGerry Weißbach            $DEPTH --;
2217d101cc1SGerry Weißbach        }
2227d101cc1SGerry Weißbach
2237d101cc1SGerry Weißbach        // Circle through the entries
2247d101cc1SGerry Weißbach        foreach ( $CURRENTNODE as $NODENAME => $ELEM )
2257d101cc1SGerry Weißbach        {
2267d101cc1SGerry Weißbach            // a node should have more than only one entry … otherwise we will not tell our name!
2277d101cc1SGerry Weißbach            $XML .= $this->__writeTOCTree($ELEM, count($ELEM) >= 1 ? $NODENAME : null, $DEPTH+1);
2287d101cc1SGerry Weißbach        }
2297d101cc1SGerry Weißbach
2307d101cc1SGerry Weißbach        // Close and return
2317d101cc1SGerry Weißbach        return $XML . ($didOpenItem?$this->__TOCItemClose($DEPTH):'');
2327d101cc1SGerry Weißbach    }
2337d101cc1SGerry Weißbach
2347d101cc1SGerry Weißbach
2357d101cc1SGerry Weißbach    function post(&$value, $key, array $additional){
2367d101cc1SGerry Weißbach        $inner_glue = $additional[0];
2377d101cc1SGerry Weißbach        $prefix = isset($additional[1])? $additional[1] : false;
2387d101cc1SGerry Weißbach        if($prefix === false) $prefix = $key;
2397d101cc1SGerry Weißbach
2407d101cc1SGerry Weißbach        $value = $value.$inner_glue.$prefix;
2417d101cc1SGerry Weißbach    }
2427d101cc1SGerry Weißbach
2437d101cc1SGerry Weißbach    function mapIDWithAnchor(&$n, $key, $postfix)
2447d101cc1SGerry Weißbach    {
2457d101cc1SGerry Weißbach        if ( empty($postfix) ) return;
2467d101cc1SGerry Weißbach        $n .= '-' . $postfix;
2477d101cc1SGerry Weißbach    }
2487d101cc1SGerry Weißbach
2497d101cc1SGerry Weißbach    function getMapID($elem, &$check)
2507d101cc1SGerry Weißbach    {
2517d101cc1SGerry Weißbach        $meta = p_get_metadata($elem['id'], 'context', true);
2527d101cc1SGerry Weißbach
25372571f03SGerry Weißbach        if ( empty($meta['id']) ) {
254*45360772SGerry Weißbach            $title = empty( $meta['title'] ) ? $this->functions->getSiteTitle($elem['id']) : $meta['title'];
255*45360772SGerry Weißbach            $meta['id'] = sectionID($this->functions->cleanId(strtolower($title)), $check);
25672571f03SGerry Weißbach        }
25772571f03SGerry Weißbach
25872571f03SGerry Weißbach        $mapID = explode('|', $meta['id']);
2597d101cc1SGerry Weißbach        array_walk($mapID, array($this, 'mapIDWithAnchor'), $elem['anchor']);
2607d101cc1SGerry Weißbach
2617d101cc1SGerry Weißbach        return $mapID;
2627d101cc1SGerry Weißbach    }
2637d101cc1SGerry Weißbach
2647d101cc1SGerry Weißbach    /**
2657d101cc1SGerry Weißbach     * internal Sort function
2667d101cc1SGerry Weißbach     * @param unknown_type $a
2677d101cc1SGerry Weißbach     * @param unknown_type $b
2687d101cc1SGerry Weißbach     */
2697d101cc1SGerry Weißbach    private function sortFunction($a, $b)
2707d101cc1SGerry Weißbach    {
2717d101cc1SGerry Weißbach        $idA = $a['id'];
2727d101cc1SGerry Weißbach        $idB = $b['id'];
2737d101cc1SGerry Weißbach
2747d101cc1SGerry Weißbach        $depthA = explode(':', getNS($idA));
2757d101cc1SGerry Weißbach        $depthB = explode(':', getNS($idB));
2767d101cc1SGerry Weißbach
2777d101cc1SGerry Weißbach        for ( $i=0; $i < min(count($depthA), count($depthB)); $i++ )
2787d101cc1SGerry Weißbach        {
2797d101cc1SGerry Weißbach            $NSCMP = strcmp($depthA[$i], $depthB[$i]);
2807d101cc1SGerry Weißbach            if ( $NSCMP != 0 )
2817d101cc1SGerry Weißbach            {
2827d101cc1SGerry Weißbach                // Something is different!
2837d101cc1SGerry Weißbach                return $NSCMP;
2847d101cc1SGerry Weißbach            }
2857d101cc1SGerry Weißbach        }
2867d101cc1SGerry Weißbach
2877d101cc1SGerry Weißbach        // There is mor in B, than in A!
2887d101cc1SGerry Weißbach        if ( count($depthA) < count($depthB) )
2897d101cc1SGerry Weißbach        {
2907d101cc1SGerry Weißbach            return -1;
2917d101cc1SGerry Weißbach        } else if ( count($depthA) > count($depthB) )
2927d101cc1SGerry Weißbach        {
2937d101cc1SGerry Weißbach            // there is more in A than in B
2947d101cc1SGerry Weißbach            return 1;
2957d101cc1SGerry Weißbach        }
2967d101cc1SGerry Weißbach
2977d101cc1SGerry Weißbach        if ( $NSCMP == 0 )
2987d101cc1SGerry Weißbach        {
2997d101cc1SGerry Weißbach            // Something is different!
3007d101cc1SGerry Weißbach            return strcmp(noNS($idA), noNS($idB));
3017d101cc1SGerry Weißbach        }
3027d101cc1SGerry Weißbach
3037d101cc1SGerry Weißbach        return 0;
3047d101cc1SGerry Weißbach    }
3057d101cc1SGerry Weißbach
3067d101cc1SGerry Weißbach    /**
3077d101cc1SGerry Weißbach     * Build the Eclipse Documentation TOC XML
3087d101cc1SGerry Weißbach     **/
3097d101cc1SGerry Weißbach    public function __getTOCXML($DATA, $XML="<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?NLS TYPE=\"org.eclipse.help.toc\"?>\n") {
3107d101cc1SGerry Weißbach
3117d101cc1SGerry Weißbach        $pagesArray = array();
3127d101cc1SGerry Weißbach
3137d101cc1SGerry Weißbach        // Go through the pages
3147d101cc1SGerry Weißbach        foreach ( $DATA as $elem ) {
3157d101cc1SGerry Weißbach
3167d101cc1SGerry Weißbach            $site = $elem['id'];
3177d101cc1SGerry Weißbach            $elems = explode('/', $this->functions->getSiteName($site));
3187d101cc1SGerry Weißbach
3197d101cc1SGerry Weißbach            // Strip Site
3207d101cc1SGerry Weißbach            array_pop( $elems );
3217d101cc1SGerry Weißbach
3227d101cc1SGerry Weißbach            // build the topic Tree
3237d101cc1SGerry Weißbach            $this->__buildTopicTree($pagesArray, $elems, $site);
3247d101cc1SGerry Weißbach        }
3257d101cc1SGerry Weißbach
3267d101cc1SGerry Weißbach        $XML .= $this->__addXMLTopic($pagesArray, 'toc');
3277d101cc1SGerry Weißbach
3287d101cc1SGerry Weißbach        return $XML;
3297d101cc1SGerry Weißbach
3307d101cc1SGerry Weißbach    }
3317d101cc1SGerry Weißbach
3327d101cc1SGerry Weißbach    /**
3337d101cc1SGerry Weißbach     * Load the topic Tree for the TOC - recursive
3347d101cc1SGerry Weißbach     **/
3357d101cc1SGerry Weißbach    private function __buildTopicTree( &$PAGES, $DATA, $SITE, $INSERTDATA = null ) {
3367d101cc1SGerry Weißbach
3377d101cc1SGerry Weißbach        if ( empty( $DATA ) || !is_array($DATA) ) {
3387d101cc1SGerry Weißbach
3397d101cc1SGerry Weißbach            if ( $INSERTDATA == null )
3407d101cc1SGerry Weißbach            {
3417d101cc1SGerry Weißbach                $INSERTDATA = $SITE;
3427d101cc1SGerry Weißbach            }
3437d101cc1SGerry Weißbach
3447d101cc1SGerry Weißbach            // This is already a namespace
3457d101cc1SGerry Weißbach            if ( is_array($PAGES[noNS($SITE)]) ) {
3467d101cc1SGerry Weißbach                // The root already exists!
3477d101cc1SGerry Weißbach                if ( !empty($PAGES[noNS($SITE)][noNS($SITE)]) ) {
3487d101cc1SGerry Weißbach                    if ( strstr($PAGES[noNS($SITE)][noNS($SITE)], $SITE) ) {
3497d101cc1SGerry Weißbach                        // The SITE is in the parent Namespace, and the current Namespace has an index with same name
3507d101cc1SGerry Weißbach                        $PAGES['__' . noNS($SITE)] = $INSERTDATA;
3517d101cc1SGerry Weißbach                    } else {
3527d101cc1SGerry Weißbach                        $PAGES['__' . noNS($SITE)] = $PAGES[noNS($SITE)][noNS($SITE)];
3537d101cc1SGerry Weißbach                        $PAGES[noNS($SITE)][noNS($SITE)] = $INSERTDATA;
3547d101cc1SGerry Weißbach                    }
3557d101cc1SGerry Weißbach                } else {
3567d101cc1SGerry Weißbach                    $PAGES[noNS($SITE)][noNS($SITE)] = $INSERTDATA;
3577d101cc1SGerry Weißbach                }
3587d101cc1SGerry Weißbach            } else {
3597d101cc1SGerry Weißbach                // just a Page
3607d101cc1SGerry Weißbach                $PAGES[noNS($SITE)] = $INSERTDATA;
3617d101cc1SGerry Weißbach            }
3627d101cc1SGerry Weißbach            return;
3637d101cc1SGerry Weißbach        }
3647d101cc1SGerry Weißbach
3657d101cc1SGerry Weißbach        $NS = array_shift($DATA);
3667d101cc1SGerry Weißbach        if ( !is_array( $PAGES[$NS] ) ) $PAGES[$NS] = empty($PAGES[$NS]) ? array() : array($PAGES[$NS]);
3677d101cc1SGerry Weißbach        $this->__buildTopicTree( $PAGES[$NS], $DATA, $SITE, $INSERTDATA );
3687d101cc1SGerry Weißbach
3697d101cc1SGerry Weißbach        return;
3707d101cc1SGerry Weißbach    }
3717d101cc1SGerry Weißbach
3727d101cc1SGerry Weißbach    /**
3737d101cc1SGerry Weißbach     * Build the Topic Tree for TOC.xml
3747d101cc1SGerry Weißbach     **/
3757d101cc1SGerry Weißbach    private function __addXMLTopic($DATA, $ITEM='topic', $LEVEL=0, $NODENAME='') {
3767d101cc1SGerry Weißbach        global $conf;
3777d101cc1SGerry Weißbach
3787d101cc1SGerry Weißbach        $DEPTH = str_repeat("\t", $LEVEL);
3797d101cc1SGerry Weißbach
3807d101cc1SGerry Weißbach        if ( !is_array($DATA) ) {
3817d101cc1SGerry Weißbach            return $DEPTH . '<' . $ITEM . ' label="' . $this->functions->getSiteTitle($DATA) . '" ' . ($ITEM != 'topic' ? 'topic' : 'href' ) . '="' . $this->functions->getSiteName($DATA) . "\" />\n";
3827d101cc1SGerry Weißbach        }
3837d101cc1SGerry Weißbach        // Is array from this point on
3847d101cc1SGerry Weißbach        list($indexTitle, $indexFile) = $this->__getIndexItem($DATA, $NODENAME);
3857d101cc1SGerry Weißbach
3867d101cc1SGerry Weißbach        if ( empty( $indexTitle) ) $indexTitle = $this->functions->getSiteTitle( $conf['start'] );
3877d101cc1SGerry Weißbach        if ( !empty( $indexFile) ) $indexFile = ($ITEM != 'topic' ? 'topic' : 'href' ) . "=\"$indexFile\"";
3887d101cc1SGerry Weißbach
3897d101cc1SGerry Weißbach        $isEmptyNode = count($DATA) == 1 && empty($indexFile);
3907d101cc1SGerry Weißbach
3917d101cc1SGerry Weißbach        if ( !$isEmptyNode && ($this->emptyNSToc || count($DATA) > 0) )
3927d101cc1SGerry Weißbach        $XML = "$DEPTH<$ITEM label=\"$indexTitle\" $indexFile>";
3937d101cc1SGerry Weißbach
3947d101cc1SGerry Weißbach        if ( !$isEmptyNode && count ($DATA) > 0 ) $XML .= "\n";
3957d101cc1SGerry Weißbach
3967d101cc1SGerry Weißbach        foreach( $DATA as $NODENAME => $NS ) {
3977d101cc1SGerry Weißbach
3987d101cc1SGerry Weißbach            $XML .= $this->__addXMLTopic($NS, ( !($this->emptyNSToc || count($DATA) > 1) && $ITEM != 'topic' ? $ITEM : 'topic' ), $LEVEL+(!$isEmptyNode ? 1 : 0), $NODENAME);
3997d101cc1SGerry Weißbach
4007d101cc1SGerry Weißbach        }
4017d101cc1SGerry Weißbach
4027d101cc1SGerry Weißbach        if ( !$isEmptyNode && count ($DATA) > 0 ) $XML .= "$DEPTH";
4037d101cc1SGerry Weißbach        if ( !$isEmptyNode && ($this->emptyNSToc || count($DATA) > 0) ) {
4047d101cc1SGerry Weißbach            $XML .= "</$ITEM>\n";
4057d101cc1SGerry Weißbach        }
4067d101cc1SGerry Weißbach
4077d101cc1SGerry Weißbach        return $XML;
4087d101cc1SGerry Weißbach    }
4097d101cc1SGerry Weißbach
4107d101cc1SGerry Weißbach
4117d101cc1SGerry Weißbach    /**
4127d101cc1SGerry Weißbach     * Get the context XML
4137d101cc1SGerry Weißbach     **/
4147d101cc1SGerry Weißbach    public function __getContextXML($DATA) {
4157d101cc1SGerry Weißbach
4167d101cc1SGerry Weißbach        $XML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?NLS TYPE=\"org.eclipse.help.context\"?>\n<contexts>\n";
4177d101cc1SGerry Weißbach
4187d101cc1SGerry Weißbach        $check = array();
4197d101cc1SGerry Weißbach        foreach ( $DATA as $elem )
4207d101cc1SGerry Weißbach        {
4217d101cc1SGerry Weißbach            $ID = $elem['id'];
4227d101cc1SGerry Weißbach            $meta = p_get_metadata($ID, 'context', true);
4237d101cc1SGerry Weißbach            if ( empty( $meta['id'] ) ) { continue; }
4247d101cc1SGerry Weißbach
4257d101cc1SGerry Weißbach            $TITLE = empty( $meta['title'] ) ? $this->functions->getSiteTitle($ID) : $meta['title'];
4267d101cc1SGerry Weißbach
4277d101cc1SGerry Weißbach            // support more than one view IDs ... for more than one reference
4287d101cc1SGerry Weißbach            $VIEWIDs = $this->getMapID($elem, $check);
4297d101cc1SGerry Weißbach
4307d101cc1SGerry Weißbach            $DESCRIPTION = $this->functions->xmlEntities(p_get_metadata($ID, 'description abstract'));
4317d101cc1SGerry Weißbach
4327d101cc1SGerry Weißbach            // Build topic Links
4337d101cc1SGerry Weißbach            $url = $this->functions->getSiteName($ID);
4347d101cc1SGerry Weißbach            $this->shortenByTranslation($url);
4357d101cc1SGerry Weißbach
4367d101cc1SGerry Weißbach            $TOPICS = array( $url => $TITLE . " (Details)" );
4377d101cc1SGerry Weißbach            $REFS = p_get_metadata($ID, 'relation references', true);
4387d101cc1SGerry Weißbach            if ( is_array($REFS) )
4397d101cc1SGerry Weißbach            foreach ( $REFS as $REL => $EXISTS ) {
4407d101cc1SGerry Weißbach                if ( !$EXISTS ) { continue; }
4417d101cc1SGerry Weißbach                $TOPICS[$this->functions->getSiteName($REL)] = $this->functions->getSiteTitle($REL);
4427d101cc1SGerry Weißbach            }
4437d101cc1SGerry Weißbach
4447d101cc1SGerry Weißbach            // build XML - include multi view IDs
4457d101cc1SGerry Weißbach            foreach ( $VIEWIDs as $VIEWID ) {
4467d101cc1SGerry Weißbach                $XML .= "\t<context id=\"$VIEWID\" title=\"$TITLE\">\n";
4477d101cc1SGerry Weißbach                $XML .= "\t\t<description>$DESCRIPTION</description>\n";
4487d101cc1SGerry Weißbach
4497d101cc1SGerry Weißbach                foreach ( $TOPICS as $URL => $LABEL ) {
4507d101cc1SGerry Weißbach                    $XML .= "\t\t<topic label=\"$LABEL\" href=\"$URL\" />\n";
4517d101cc1SGerry Weißbach                }
4527d101cc1SGerry Weißbach
4537d101cc1SGerry Weißbach                $XML .= "\t</context>\n";
4547d101cc1SGerry Weißbach            }
4557d101cc1SGerry Weißbach        }
4567d101cc1SGerry Weißbach
4577d101cc1SGerry Weißbach        $XML .= "</contexts>";
4587d101cc1SGerry Weißbach        return $XML;
4597d101cc1SGerry Weißbach
4607d101cc1SGerry Weißbach    }
4617d101cc1SGerry Weißbach
4627d101cc1SGerry Weißbach    /**
4637d101cc1SGerry Weißbach     * Determine if this is an index - and if so, find its Title
4647d101cc1SGerry Weißbach     **/
4657d101cc1SGerry Weißbach    private function __getIndexItem(&$DATA, $NODENAME='') {
4667d101cc1SGerry Weißbach        global $conf;
4677d101cc1SGerry Weißbach
4687d101cc1SGerry Weißbach        if ( !is_array($DATA) ) { return; }
4697d101cc1SGerry Weißbach
4707d101cc1SGerry Weißbach        $indexTitle = '';
4717d101cc1SGerry Weißbach        $indexFile = '';
4727d101cc1SGerry Weißbach        foreach ( $DATA as $NODE => $indexSearch) {
4737d101cc1SGerry Weißbach            // Skip next Namespaces
4747d101cc1SGerry Weißbach            if ( is_array($indexSearch) ) { continue; }
4757d101cc1SGerry Weißbach
4767d101cc1SGerry Weißbach            // Skip if this is not a start
4777d101cc1SGerry Weißbach            if ( $NODE != $conf['start'] ) { continue; }
4787d101cc1SGerry Weißbach
4797d101cc1SGerry Weißbach            $indexTitle = $this->functions->getSiteTitle( $indexSearch );
4807d101cc1SGerry Weißbach            $indexFile = $indexSearch;
4817d101cc1SGerry Weißbach            unset($DATA[$NODE]);
4827d101cc1SGerry Weißbach            break;
4837d101cc1SGerry Weißbach        }
4847d101cc1SGerry Weißbach
4857d101cc1SGerry Weißbach        if ( empty($indexFile) && !empty($DATA[$NODENAME]) ) {
4867d101cc1SGerry Weißbach            $indexTitle = $this->functions->getSiteTitle( $DATA[$NODENAME] );
4877d101cc1SGerry Weißbach            $indexFile = $DATA[$NODENAME];
4887d101cc1SGerry Weißbach            unset($DATA[$NODENAME]);
4897d101cc1SGerry Weißbach        }
4907d101cc1SGerry Weißbach
4917d101cc1SGerry Weißbach        return array($indexTitle, $this->functions->getSiteName($indexFile));
4927d101cc1SGerry Weißbach    }
4937d101cc1SGerry Weißbach}
4947d101cc1SGerry Weißbach
4957d101cc1SGerry Weißbach?>