xref: /plugin/siteexport/inc/toc.php (revision 7d101cc131696cb3a0de345d8044a69fb2ef70e9)
1*7d101cc1SGerry Weißbach<?php
2*7d101cc1SGerry Weißbach
3*7d101cc1SGerry Weißbachif(!defined('DOKU_PLUGIN')) die('meh');
4*7d101cc1SGerry Weißbach
5*7d101cc1SGerry Weißbachclass siteexport_toc
6*7d101cc1SGerry Weißbach{
7*7d101cc1SGerry Weißbach    private $emptyNSToc = true;
8*7d101cc1SGerry Weißbach    private $functions = null;
9*7d101cc1SGerry Weißbach    public $translation = null;
10*7d101cc1SGerry Weißbach
11*7d101cc1SGerry Weißbach    public function siteexport_toc($functions)
12*7d101cc1SGerry Weißbach    {
13*7d101cc1SGerry Weißbach        $this->emptyNSToc = !empty($_REQUEST['emptyTocElem']);
14*7d101cc1SGerry Weißbach        $this->functions = $functions;
15*7d101cc1SGerry Weißbach
16*7d101cc1SGerry Weißbach        if ( $functions->settings->TOCMapWithoutTranslation )
17*7d101cc1SGerry Weißbach        {
18*7d101cc1SGerry Weißbach             plugin_load('helper', 'translation' );
19*7d101cc1SGerry Weißbach        }
20*7d101cc1SGerry Weißbach    }
21*7d101cc1SGerry Weißbach
22*7d101cc1SGerry Weißbach    private function shortenByTranslation(&$inputURL, $deepSearch = false)
23*7d101cc1SGerry Weißbach    {
24*7d101cc1SGerry Weißbach        if ( $this->translation )
25*7d101cc1SGerry Weißbach        {
26*7d101cc1SGerry Weißbach            $inputURL = str_replace(':', '/', $inputURL);
27*7d101cc1SGerry Weißbach            $url = explode('/', $inputURL);
28*7d101cc1SGerry Weißbach
29*7d101cc1SGerry Weißbach            for( $i=0; $i<count($url); $i++ )
30*7d101cc1SGerry Weißbach            {
31*7d101cc1SGerry Weißbach                if ( in_array($url[$i], $this->translation->trans ) )
32*7d101cc1SGerry Weißbach                {
33*7d101cc1SGerry Weißbach                    // Rauswerfen und weg
34*7d101cc1SGerry Weißbach                    $url[$i] = '';
35*7d101cc1SGerry Weißbach                    break;
36*7d101cc1SGerry Weißbach                }
37*7d101cc1SGerry Weißbach
38*7d101cc1SGerry Weißbach                if ( !$deepSearch )
39*7d101cc1SGerry Weißbach                {
40*7d101cc1SGerry Weißbach                    break;
41*7d101cc1SGerry Weißbach                }
42*7d101cc1SGerry Weißbach
43*7d101cc1SGerry Weißbach                // Ok, remove anyway
44*7d101cc1SGerry Weißbach                $url[$i] = '';
45*7d101cc1SGerry Weißbach            }
46*7d101cc1SGerry Weißbach
47*7d101cc1SGerry Weißbach            $inputURL = implode('/', $url);
48*7d101cc1SGerry Weißbach            $inputURL = preg_replace("$\/+$", "/", $inputURL);
49*7d101cc1SGerry Weißbach        }
50*7d101cc1SGerry Weißbach
51*7d101cc1SGerry Weißbach        if ( strlen($inputURL) > 0 && substr($inputURL, 0, 1) == '/' )
52*7d101cc1SGerry Weißbach        {
53*7d101cc1SGerry Weißbach            $inputURL = substr($inputURL, 1);
54*7d101cc1SGerry Weißbach        }
55*7d101cc1SGerry Weißbach
56*7d101cc1SGerry Weißbach        return $inputURL;
57*7d101cc1SGerry Weißbach    }
58*7d101cc1SGerry Weißbach
59*7d101cc1SGerry Weißbach    /**
60*7d101cc1SGerry Weißbach     * Build the Java Documentation TOC XML
61*7d101cc1SGerry Weißbach     **/
62*7d101cc1SGerry Weißbach    public function __getJavaHelpTOCXML($DATA) {
63*7d101cc1SGerry Weißbach
64*7d101cc1SGerry Weißbach        if ( count ( $DATA) == 0 ) {
65*7d101cc1SGerry Weißbach            return false;
66*7d101cc1SGerry Weißbach        }
67*7d101cc1SGerry Weißbach
68*7d101cc1SGerry Weißbach        $TOCXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<toc>";
69*7d101cc1SGerry Weißbach        $MAPXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<map version=\"1.0\">";
70*7d101cc1SGerry Weißbach        // usort($DATA, array($this, 'sortFunction'));
71*7d101cc1SGerry Weißbach
72*7d101cc1SGerry Weißbach        // Go through the pages
73*7d101cc1SGerry Weißbach        $CHECKDATA = array();
74*7d101cc1SGerry Weißbach        $nData = $DATA;
75*7d101cc1SGerry Weißbach        $DATA = array();
76*7d101cc1SGerry Weißbach        $check = array();
77*7d101cc1SGerry Weißbach        $startPageID = null;
78*7d101cc1SGerry Weißbach
79*7d101cc1SGerry Weißbach        foreach ( $nData as $elem )
80*7d101cc1SGerry Weißbach        {
81*7d101cc1SGerry Weißbach			// Check if available
82*7d101cc1SGerry Weißbach            $anchor = ( !empty($elem['anchor']) ? '#' . $elem['anchor'] : '' );
83*7d101cc1SGerry Weißbach            $elem['url'] = $this->functions->getSiteName($elem['id']);
84*7d101cc1SGerry Weißbach            $elem['mapURL'] = $elem['url'];
85*7d101cc1SGerry Weißbach            $this->shortenByTranslation($elem['url']);
86*7d101cc1SGerry Weißbach
87*7d101cc1SGerry Weißbach            // only add an url once
88*7d101cc1SGerry Weißbach            if ( in_array($elem['url'], $CHECKDATA) ) { continue; }
89*7d101cc1SGerry Weißbach
90*7d101cc1SGerry Weißbach            if ( empty( $elem['name'] ) ) {
91*7d101cc1SGerry Weißbach                $elem['name'] = $this->functions->getSiteTitle($elem['id']);
92*7d101cc1SGerry Weißbach            }
93*7d101cc1SGerry Weißbach
94*7d101cc1SGerry Weißbach			// if not there, no map ids will be generated
95*7d101cc1SGerry Weißbach            $elem['mapID'] = intval($elem['exists']) == 1 ? $this->getMapID($elem, $check) : array();
96*7d101cc1SGerry Weißbach
97*7d101cc1SGerry Weißbach            if ( empty($elem['depth']) ) $elem['depth'] = count(explode('/', $elem['url']));
98*7d101cc1SGerry Weißbach            $CHECKDATA[] = $elem['url'];
99*7d101cc1SGerry Weißbach
100*7d101cc1SGerry Weißbach            if ( $startPageID == null )
101*7d101cc1SGerry Weißbach            {
102*7d101cc1SGerry Weißbach                $startPageID = $elem['mapID'][0];
103*7d101cc1SGerry Weißbach            }
104*7d101cc1SGerry Weißbach
105*7d101cc1SGerry Weißbach            // Go on building mapXML
106*7d101cc1SGerry Weißbach            $this->shortenByTranslation($elem['mapURL'], true); // true to already remove all language stuff - false if not
107*7d101cc1SGerry Weißbach            foreach ( $elem['mapID'] as $VIEWID ) {
108*7d101cc1SGerry Weißbach                $MAPXML .= "\n\t<mapID target=\"$VIEWID\" url=\"" . $elem['mapURL'] . $anchor . "\"/>";
109*7d101cc1SGerry Weißbach            }
110*7d101cc1SGerry Weißbach
111*7d101cc1SGerry Weißbach            $elem['tocNS'] = getNS(cleanID($elem['url']));
112*7d101cc1SGerry Weißbach            $elem['tocNS'] = explode('/', $this->shortenByTranslation($elem['tocNS'], true));
113*7d101cc1SGerry Weißbach
114*7d101cc1SGerry Weißbach            $this->__buildTOCTree($DATA, $elem['tocNS'], $elem);
115*7d101cc1SGerry Weißbach        }
116*7d101cc1SGerry Weißbach
117*7d101cc1SGerry Weißbach        $TOCXML .= $this->__writeTOCTree($DATA) . "\n</toc>";
118*7d101cc1SGerry Weißbach        $MAPXML .= "\n</map>";
119*7d101cc1SGerry Weißbach/*
120*7d101cc1SGerry 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
121*7d101cc1SGerry Weißbach        print "<html><pre>";
122*7d101cc1SGerry Weißbach        print_r($DATA);
123*7d101cc1SGerry Weißbach        $TOCXML = str_replace("<", "&lt;", str_replace(">", "&gt;", $TOCXML));
124*7d101cc1SGerry Weißbach        print "$TOCXML";
125*7d101cc1SGerry Weißbach
126*7d101cc1SGerry Weißbach        $MAPXML = str_replace("<", "&lt;", str_replace(">", "&gt;", $MAPXML));
127*7d101cc1SGerry Weißbach        print "$MAPXML";
128*7d101cc1SGerry Weißbach
129*7d101cc1SGerry Weißbach        print "</pre></html>";
130*7d101cc1SGerry Weißbach        exit;
131*7d101cc1SGerry Weißbach/*/
132*7d101cc1SGerry Weißbach        return array($TOCXML, $MAPXML, $startPageID);
133*7d101cc1SGerry Weißbach//*/
134*7d101cc1SGerry Weißbach    }
135*7d101cc1SGerry Weißbach
136*7d101cc1SGerry Weißbach    /**
137*7d101cc1SGerry Weißbach     * Prepare the TOC Tree
138*7d101cc1SGerry Weißbach     **/
139*7d101cc1SGerry Weißbach    private function __buildTOCTree(&$DATA, $currentNSArray, $elemToAdd)
140*7d101cc1SGerry Weißbach    {
141*7d101cc1SGerry Weißbach        global $conf;
142*7d101cc1SGerry Weißbach
143*7d101cc1SGerry Weißbach        if ( empty($currentNSArray) )
144*7d101cc1SGerry Weißbach        {
145*7d101cc1SGerry Weißbach            // In Depth, let go!
146*7d101cc1SGerry Weißbach            $DATA[noNS($elemToAdd['id'])] = $elemToAdd;
147*7d101cc1SGerry Weißbach            return;
148*7d101cc1SGerry Weißbach        } else if (count($currentNSArray) == 1 && $currentNSArray[0] == '' && noNS($elemToAdd['id']) == $conf['start'] )
149*7d101cc1SGerry Weißbach        {
150*7d101cc1SGerry Weißbach            // Wird gebraucht um die erste Ebene sauber zu bauen … kann aber irgendwelche Nebeneffekte haben
151*7d101cc1SGerry Weißbach            $DATA[noNS($elemToAdd['id'])] = $elemToAdd;
152*7d101cc1SGerry Weißbach            return;
153*7d101cc1SGerry Weißbach        }
154*7d101cc1SGerry Weißbach
155*7d101cc1SGerry Weißbach        $currentLevel = array_shift($currentNSArray);
156*7d101cc1SGerry Weißbach        if ( empty($DATA[$currentLevel]) ) {
157*7d101cc1SGerry Weißbach            $DATA[$currentLevel] = array();
158*7d101cc1SGerry Weißbach        }
159*7d101cc1SGerry Weißbach
160*7d101cc1SGerry Weißbach        $this->__buildTOCTree($DATA[$currentLevel], $currentNSArray, $elemToAdd);
161*7d101cc1SGerry Weißbach    }
162*7d101cc1SGerry Weißbach
163*7d101cc1SGerry Weißbach    /**
164*7d101cc1SGerry Weißbach     * Create a single TOC Item
165*7d101cc1SGerry Weißbach     **/
166*7d101cc1SGerry Weißbach    private function __TOCItem($item, $depth, $selfClosed=true)
167*7d101cc1SGerry Weißbach    {
168*7d101cc1SGerry Weißbach        $targetID = $item['mapID'][0];
169*7d101cc1SGerry Weißbach        if ( empty($targetID) ) {
170*7d101cc1SGerry Weißbach            $targetID = strtolower($item['name']);
171*7d101cc1SGerry Weißbach        }
172*7d101cc1SGerry Weißbach        return "\n" . str_repeat("\t", max($depth, 0)+1) . "<tocitem target=\"$targetID\"" . (intval($item['exists']) == 1 ? " text=\"" . $item['name'] . "\"" : "") . ($selfClosed?'/':'') . ">";
173*7d101cc1SGerry Weißbach    }
174*7d101cc1SGerry Weißbach
175*7d101cc1SGerry Weißbach    /**
176*7d101cc1SGerry Weißbach     * Create a single TOC Item
177*7d101cc1SGerry Weißbach     **/
178*7d101cc1SGerry Weißbach    private function __TOCItemClose($depth)
179*7d101cc1SGerry Weißbach    {
180*7d101cc1SGerry Weißbach        return "\n" . str_repeat("\t", max($depth, 0)+1) . "</tocitem>";
181*7d101cc1SGerry Weißbach    }
182*7d101cc1SGerry Weißbach
183*7d101cc1SGerry Weißbach    /**
184*7d101cc1SGerry Weißbach     * Write the whole TOC TREE
185*7d101cc1SGerry Weißbach     **/
186*7d101cc1SGerry Weißbach    private function __writeTOCTree($CURRENTNODE, $CURRENTNODENAME = null, $DEPTH=0) {
187*7d101cc1SGerry Weißbach        global $conf;
188*7d101cc1SGerry Weißbach
189*7d101cc1SGerry Weißbach        $XML = '';
190*7d101cc1SGerry Weißbach        $didOpenItem = false;
191*7d101cc1SGerry Weißbach        if ( !is_array($CURRENTNODE) || empty($CURRENTNODE) )
192*7d101cc1SGerry Weißbach        {
193*7d101cc1SGerry Weißbach            // errr … no.
194*7d101cc1SGerry Weißbach            return $XML;
195*7d101cc1SGerry Weißbach        }
196*7d101cc1SGerry Weißbach
197*7d101cc1SGerry Weißbach        // This is an element!
198*7d101cc1SGerry Weißbach        if ( !empty($CURRENTNODE['id']) )
199*7d101cc1SGerry Weißbach        {
200*7d101cc1SGerry Weißbach            // This has to be an item!
201*7d101cc1SGerry Weißbach            return $this->__TOCItem($CURRENTNODE, $DEPTH);
202*7d101cc1SGerry Weißbach        }
203*7d101cc1SGerry Weißbach
204*7d101cc1SGerry Weißbach        // Look for start page
205*7d101cc1SGerry Weißbach        if ( !empty($CURRENTNODE[$conf['start']]) )
206*7d101cc1SGerry Weißbach        {
207*7d101cc1SGerry Weißbach            // YAY! StartPage found.
208*7d101cc1SGerry Weißbach            $didOpenItem = !(count($CURRENTNODE) == 1);
209*7d101cc1SGerry Weißbach            $XML .= $this->__TOCItem($CURRENTNODE[$conf['start']], $DEPTH, !$didOpenItem );
210*7d101cc1SGerry Weißbach            unset($CURRENTNODE[$conf['start']]);
211*7d101cc1SGerry Weißbach        } else if ($CURRENTNODENAME != null) {
212*7d101cc1SGerry Weißbach            // We have a parent node for what is comming … lets honor that
213*7d101cc1SGerry Weißbach            $didOpenItem = !(count($CURRENTNODE) == 0);
214*7d101cc1SGerry Weißbach            $XML .= $this->__TOCItem(array('name' => ucwords($CURRENTNODENAME)), $DEPTH, !$didOpenItem );
215*7d101cc1SGerry Weißbach        } else {
216*7d101cc1SGerry Weißbach            // Woohoo … empty node? do not count up!
217*7d101cc1SGerry Weißbach            $DEPTH --;
218*7d101cc1SGerry Weißbach        }
219*7d101cc1SGerry Weißbach
220*7d101cc1SGerry Weißbach        // Circle through the entries
221*7d101cc1SGerry Weißbach        foreach ( $CURRENTNODE as $NODENAME => $ELEM )
222*7d101cc1SGerry Weißbach        {
223*7d101cc1SGerry Weißbach            // a node should have more than only one entry … otherwise we will not tell our name!
224*7d101cc1SGerry Weißbach            $XML .= $this->__writeTOCTree($ELEM, count($ELEM) >= 1 ? $NODENAME : null, $DEPTH+1);
225*7d101cc1SGerry Weißbach        }
226*7d101cc1SGerry Weißbach
227*7d101cc1SGerry Weißbach        // Close and return
228*7d101cc1SGerry Weißbach        return $XML . ($didOpenItem?$this->__TOCItemClose($DEPTH):'');
229*7d101cc1SGerry Weißbach    }
230*7d101cc1SGerry Weißbach
231*7d101cc1SGerry Weißbach
232*7d101cc1SGerry Weißbach    function post(&$value, $key, array $additional){
233*7d101cc1SGerry Weißbach        $inner_glue = $additional[0];
234*7d101cc1SGerry Weißbach        $prefix = isset($additional[1])? $additional[1] : false;
235*7d101cc1SGerry Weißbach        if($prefix === false) $prefix = $key;
236*7d101cc1SGerry Weißbach
237*7d101cc1SGerry Weißbach        $value = $value.$inner_glue.$prefix;
238*7d101cc1SGerry Weißbach    }
239*7d101cc1SGerry Weißbach
240*7d101cc1SGerry Weißbach    function mapIDWithAnchor(&$n, $key, $postfix)
241*7d101cc1SGerry Weißbach    {
242*7d101cc1SGerry Weißbach        if ( empty($postfix) ) return;
243*7d101cc1SGerry Weißbach        $n .= '-' . $postfix;
244*7d101cc1SGerry Weißbach    }
245*7d101cc1SGerry Weißbach
246*7d101cc1SGerry Weißbach    function getMapID($elem, &$check)
247*7d101cc1SGerry Weißbach    {
248*7d101cc1SGerry Weißbach        $meta = p_get_metadata($elem['id'], 'context', true);
249*7d101cc1SGerry Weißbach        $mapID = explode('|', empty( $meta['id'] ) ? sectionID($elem['name'], $check) : $meta['id']);
250*7d101cc1SGerry Weißbach
251*7d101cc1SGerry Weißbach        array_walk($mapID, array($this, 'mapIDWithAnchor'), $elem['anchor']);
252*7d101cc1SGerry Weißbach
253*7d101cc1SGerry Weißbach        return $mapID;
254*7d101cc1SGerry Weißbach    }
255*7d101cc1SGerry Weißbach
256*7d101cc1SGerry Weißbach    /**
257*7d101cc1SGerry Weißbach     * internal Sort function
258*7d101cc1SGerry Weißbach     * @param unknown_type $a
259*7d101cc1SGerry Weißbach     * @param unknown_type $b
260*7d101cc1SGerry Weißbach     */
261*7d101cc1SGerry Weißbach    private function sortFunction($a, $b)
262*7d101cc1SGerry Weißbach    {
263*7d101cc1SGerry Weißbach        $idA = $a['id'];
264*7d101cc1SGerry Weißbach        $idB = $b['id'];
265*7d101cc1SGerry Weißbach
266*7d101cc1SGerry Weißbach        $depthA = explode(':', getNS($idA));
267*7d101cc1SGerry Weißbach        $depthB = explode(':', getNS($idB));
268*7d101cc1SGerry Weißbach
269*7d101cc1SGerry Weißbach        for ( $i=0; $i < min(count($depthA), count($depthB)); $i++ )
270*7d101cc1SGerry Weißbach        {
271*7d101cc1SGerry Weißbach            $NSCMP = strcmp($depthA[$i], $depthB[$i]);
272*7d101cc1SGerry Weißbach            if ( $NSCMP != 0 )
273*7d101cc1SGerry Weißbach            {
274*7d101cc1SGerry Weißbach                // Something is different!
275*7d101cc1SGerry Weißbach                return $NSCMP;
276*7d101cc1SGerry Weißbach            }
277*7d101cc1SGerry Weißbach        }
278*7d101cc1SGerry Weißbach
279*7d101cc1SGerry Weißbach        // There is mor in B, than in A!
280*7d101cc1SGerry Weißbach        if ( count($depthA) < count($depthB) )
281*7d101cc1SGerry Weißbach        {
282*7d101cc1SGerry Weißbach            return -1;
283*7d101cc1SGerry Weißbach        } else if ( count($depthA) > count($depthB) )
284*7d101cc1SGerry Weißbach        {
285*7d101cc1SGerry Weißbach            // there is more in A than in B
286*7d101cc1SGerry Weißbach            return 1;
287*7d101cc1SGerry Weißbach        }
288*7d101cc1SGerry Weißbach
289*7d101cc1SGerry Weißbach        if ( $NSCMP == 0 )
290*7d101cc1SGerry Weißbach        {
291*7d101cc1SGerry Weißbach            // Something is different!
292*7d101cc1SGerry Weißbach            return strcmp(noNS($idA), noNS($idB));
293*7d101cc1SGerry Weißbach        }
294*7d101cc1SGerry Weißbach
295*7d101cc1SGerry Weißbach        return 0;
296*7d101cc1SGerry Weißbach    }
297*7d101cc1SGerry Weißbach
298*7d101cc1SGerry Weißbach    /**
299*7d101cc1SGerry Weißbach     * Build the Eclipse Documentation TOC XML
300*7d101cc1SGerry Weißbach     **/
301*7d101cc1SGerry Weißbach    public function __getTOCXML($DATA, $XML="<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?NLS TYPE=\"org.eclipse.help.toc\"?>\n") {
302*7d101cc1SGerry Weißbach
303*7d101cc1SGerry Weißbach        $pagesArray = array();
304*7d101cc1SGerry Weißbach
305*7d101cc1SGerry Weißbach        // Go through the pages
306*7d101cc1SGerry Weißbach        foreach ( $DATA as $elem ) {
307*7d101cc1SGerry Weißbach
308*7d101cc1SGerry Weißbach            $site = $elem['id'];
309*7d101cc1SGerry Weißbach            $elems = explode('/', $this->functions->getSiteName($site));
310*7d101cc1SGerry Weißbach
311*7d101cc1SGerry Weißbach            // Strip Site
312*7d101cc1SGerry Weißbach            array_pop( $elems );
313*7d101cc1SGerry Weißbach
314*7d101cc1SGerry Weißbach            // build the topic Tree
315*7d101cc1SGerry Weißbach            $this->__buildTopicTree($pagesArray, $elems, $site);
316*7d101cc1SGerry Weißbach        }
317*7d101cc1SGerry Weißbach
318*7d101cc1SGerry Weißbach        $XML .= $this->__addXMLTopic($pagesArray, 'toc');
319*7d101cc1SGerry Weißbach
320*7d101cc1SGerry Weißbach        return $XML;
321*7d101cc1SGerry Weißbach
322*7d101cc1SGerry Weißbach    }
323*7d101cc1SGerry Weißbach
324*7d101cc1SGerry Weißbach    /**
325*7d101cc1SGerry Weißbach     * Load the topic Tree for the TOC - recursive
326*7d101cc1SGerry Weißbach     **/
327*7d101cc1SGerry Weißbach    private function __buildTopicTree( &$PAGES, $DATA, $SITE, $INSERTDATA = null ) {
328*7d101cc1SGerry Weißbach
329*7d101cc1SGerry Weißbach        if ( empty( $DATA ) || !is_array($DATA) ) {
330*7d101cc1SGerry Weißbach
331*7d101cc1SGerry Weißbach            if ( $INSERTDATA == null )
332*7d101cc1SGerry Weißbach            {
333*7d101cc1SGerry Weißbach                $INSERTDATA = $SITE;
334*7d101cc1SGerry Weißbach            }
335*7d101cc1SGerry Weißbach
336*7d101cc1SGerry Weißbach            // This is already a namespace
337*7d101cc1SGerry Weißbach            if ( is_array($PAGES[noNS($SITE)]) ) {
338*7d101cc1SGerry Weißbach                // The root already exists!
339*7d101cc1SGerry Weißbach                if ( !empty($PAGES[noNS($SITE)][noNS($SITE)]) ) {
340*7d101cc1SGerry Weißbach                    if ( strstr($PAGES[noNS($SITE)][noNS($SITE)], $SITE) ) {
341*7d101cc1SGerry Weißbach                        // The SITE is in the parent Namespace, and the current Namespace has an index with same name
342*7d101cc1SGerry Weißbach                        $PAGES['__' . noNS($SITE)] = $INSERTDATA;
343*7d101cc1SGerry Weißbach                    } else {
344*7d101cc1SGerry Weißbach                        $PAGES['__' . noNS($SITE)] = $PAGES[noNS($SITE)][noNS($SITE)];
345*7d101cc1SGerry Weißbach                        $PAGES[noNS($SITE)][noNS($SITE)] = $INSERTDATA;
346*7d101cc1SGerry Weißbach                    }
347*7d101cc1SGerry Weißbach                } else {
348*7d101cc1SGerry Weißbach                    $PAGES[noNS($SITE)][noNS($SITE)] = $INSERTDATA;
349*7d101cc1SGerry Weißbach                }
350*7d101cc1SGerry Weißbach            } else {
351*7d101cc1SGerry Weißbach                // just a Page
352*7d101cc1SGerry Weißbach                $PAGES[noNS($SITE)] = $INSERTDATA;
353*7d101cc1SGerry Weißbach            }
354*7d101cc1SGerry Weißbach            return;
355*7d101cc1SGerry Weißbach        }
356*7d101cc1SGerry Weißbach
357*7d101cc1SGerry Weißbach        $NS = array_shift($DATA);
358*7d101cc1SGerry Weißbach        if ( !is_array( $PAGES[$NS] ) ) $PAGES[$NS] = empty($PAGES[$NS]) ? array() : array($PAGES[$NS]);
359*7d101cc1SGerry Weißbach        $this->__buildTopicTree( $PAGES[$NS], $DATA, $SITE, $INSERTDATA );
360*7d101cc1SGerry Weißbach
361*7d101cc1SGerry Weißbach        return;
362*7d101cc1SGerry Weißbach    }
363*7d101cc1SGerry Weißbach
364*7d101cc1SGerry Weißbach    /**
365*7d101cc1SGerry Weißbach     * Build the Topic Tree for TOC.xml
366*7d101cc1SGerry Weißbach     **/
367*7d101cc1SGerry Weißbach    private function __addXMLTopic($DATA, $ITEM='topic', $LEVEL=0, $NODENAME='') {
368*7d101cc1SGerry Weißbach        global $conf;
369*7d101cc1SGerry Weißbach
370*7d101cc1SGerry Weißbach        $DEPTH = str_repeat("\t", $LEVEL);
371*7d101cc1SGerry Weißbach
372*7d101cc1SGerry Weißbach        if ( !is_array($DATA) ) {
373*7d101cc1SGerry Weißbach            return $DEPTH . '<' . $ITEM . ' label="' . $this->functions->getSiteTitle($DATA) . '" ' . ($ITEM != 'topic' ? 'topic' : 'href' ) . '="' . $this->functions->getSiteName($DATA) . "\" />\n";
374*7d101cc1SGerry Weißbach        }
375*7d101cc1SGerry Weißbach        // Is array from this point on
376*7d101cc1SGerry Weißbach        list($indexTitle, $indexFile) = $this->__getIndexItem($DATA, $NODENAME);
377*7d101cc1SGerry Weißbach
378*7d101cc1SGerry Weißbach        if ( empty( $indexTitle) ) $indexTitle = $this->functions->getSiteTitle( $conf['start'] );
379*7d101cc1SGerry Weißbach        if ( !empty( $indexFile) ) $indexFile = ($ITEM != 'topic' ? 'topic' : 'href' ) . "=\"$indexFile\"";
380*7d101cc1SGerry Weißbach
381*7d101cc1SGerry Weißbach        $isEmptyNode = count($DATA) == 1 && empty($indexFile);
382*7d101cc1SGerry Weißbach
383*7d101cc1SGerry Weißbach        if ( !$isEmptyNode && ($this->emptyNSToc || count($DATA) > 0) )
384*7d101cc1SGerry Weißbach        $XML = "$DEPTH<$ITEM label=\"$indexTitle\" $indexFile>";
385*7d101cc1SGerry Weißbach
386*7d101cc1SGerry Weißbach        if ( !$isEmptyNode && count ($DATA) > 0 ) $XML .= "\n";
387*7d101cc1SGerry Weißbach
388*7d101cc1SGerry Weißbach        foreach( $DATA as $NODENAME => $NS ) {
389*7d101cc1SGerry Weißbach
390*7d101cc1SGerry Weißbach            $XML .= $this->__addXMLTopic($NS, ( !($this->emptyNSToc || count($DATA) > 1) && $ITEM != 'topic' ? $ITEM : 'topic' ), $LEVEL+(!$isEmptyNode ? 1 : 0), $NODENAME);
391*7d101cc1SGerry Weißbach
392*7d101cc1SGerry Weißbach        }
393*7d101cc1SGerry Weißbach
394*7d101cc1SGerry Weißbach        if ( !$isEmptyNode && count ($DATA) > 0 ) $XML .= "$DEPTH";
395*7d101cc1SGerry Weißbach        if ( !$isEmptyNode && ($this->emptyNSToc || count($DATA) > 0) ) {
396*7d101cc1SGerry Weißbach            $XML .= "</$ITEM>\n";
397*7d101cc1SGerry Weißbach        }
398*7d101cc1SGerry Weißbach
399*7d101cc1SGerry Weißbach        return $XML;
400*7d101cc1SGerry Weißbach    }
401*7d101cc1SGerry Weißbach
402*7d101cc1SGerry Weißbach
403*7d101cc1SGerry Weißbach    /**
404*7d101cc1SGerry Weißbach     * Get the context XML
405*7d101cc1SGerry Weißbach     **/
406*7d101cc1SGerry Weißbach    public function __getContextXML($DATA) {
407*7d101cc1SGerry Weißbach
408*7d101cc1SGerry Weißbach        $XML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?NLS TYPE=\"org.eclipse.help.context\"?>\n<contexts>\n";
409*7d101cc1SGerry Weißbach
410*7d101cc1SGerry Weißbach        $check = array();
411*7d101cc1SGerry Weißbach        foreach ( $DATA as $elem )
412*7d101cc1SGerry Weißbach        {
413*7d101cc1SGerry Weißbach            $ID = $elem['id'];
414*7d101cc1SGerry Weißbach            $meta = p_get_metadata($ID, 'context', true);
415*7d101cc1SGerry Weißbach            if ( empty( $meta['id'] ) ) { continue; }
416*7d101cc1SGerry Weißbach
417*7d101cc1SGerry Weißbach            $TITLE = empty( $meta['title'] ) ? $this->functions->getSiteTitle($ID) : $meta['title'];
418*7d101cc1SGerry Weißbach
419*7d101cc1SGerry Weißbach            // support more than one view IDs ... for more than one reference
420*7d101cc1SGerry Weißbach            $VIEWIDs = $this->getMapID($elem, $check);
421*7d101cc1SGerry Weißbach
422*7d101cc1SGerry Weißbach            $DESCRIPTION = $this->functions->xmlEntities(p_get_metadata($ID, 'description abstract'));
423*7d101cc1SGerry Weißbach
424*7d101cc1SGerry Weißbach            // Build topic Links
425*7d101cc1SGerry Weißbach            $url = $this->functions->getSiteName($ID);
426*7d101cc1SGerry Weißbach            $this->shortenByTranslation($url);
427*7d101cc1SGerry Weißbach
428*7d101cc1SGerry Weißbach            $TOPICS = array( $url => $TITLE . " (Details)" );
429*7d101cc1SGerry Weißbach            $REFS = p_get_metadata($ID, 'relation references', true);
430*7d101cc1SGerry Weißbach            if ( is_array($REFS) )
431*7d101cc1SGerry Weißbach            foreach ( $REFS as $REL => $EXISTS ) {
432*7d101cc1SGerry Weißbach                if ( !$EXISTS ) { continue; }
433*7d101cc1SGerry Weißbach                $TOPICS[$this->functions->getSiteName($REL)] = $this->functions->getSiteTitle($REL);
434*7d101cc1SGerry Weißbach            }
435*7d101cc1SGerry Weißbach
436*7d101cc1SGerry Weißbach            // build XML - include multi view IDs
437*7d101cc1SGerry Weißbach            foreach ( $VIEWIDs as $VIEWID ) {
438*7d101cc1SGerry Weißbach                $XML .= "\t<context id=\"$VIEWID\" title=\"$TITLE\">\n";
439*7d101cc1SGerry Weißbach                $XML .= "\t\t<description>$DESCRIPTION</description>\n";
440*7d101cc1SGerry Weißbach
441*7d101cc1SGerry Weißbach                foreach ( $TOPICS as $URL => $LABEL ) {
442*7d101cc1SGerry Weißbach                    $XML .= "\t\t<topic label=\"$LABEL\" href=\"$URL\" />\n";
443*7d101cc1SGerry Weißbach                }
444*7d101cc1SGerry Weißbach
445*7d101cc1SGerry Weißbach                $XML .= "\t</context>\n";
446*7d101cc1SGerry Weißbach            }
447*7d101cc1SGerry Weißbach        }
448*7d101cc1SGerry Weißbach
449*7d101cc1SGerry Weißbach        $XML .= "</contexts>";
450*7d101cc1SGerry Weißbach        return $XML;
451*7d101cc1SGerry Weißbach
452*7d101cc1SGerry Weißbach    }
453*7d101cc1SGerry Weißbach
454*7d101cc1SGerry Weißbach    /**
455*7d101cc1SGerry Weißbach     * Determine if this is an index - and if so, find its Title
456*7d101cc1SGerry Weißbach     **/
457*7d101cc1SGerry Weißbach    private function __getIndexItem(&$DATA, $NODENAME='') {
458*7d101cc1SGerry Weißbach        global $conf;
459*7d101cc1SGerry Weißbach
460*7d101cc1SGerry Weißbach        if ( !is_array($DATA) ) { return; }
461*7d101cc1SGerry Weißbach
462*7d101cc1SGerry Weißbach        $indexTitle = '';
463*7d101cc1SGerry Weißbach        $indexFile = '';
464*7d101cc1SGerry Weißbach        foreach ( $DATA as $NODE => $indexSearch) {
465*7d101cc1SGerry Weißbach            // Skip next Namespaces
466*7d101cc1SGerry Weißbach            if ( is_array($indexSearch) ) { continue; }
467*7d101cc1SGerry Weißbach
468*7d101cc1SGerry Weißbach            // Skip if this is not a start
469*7d101cc1SGerry Weißbach            if ( $NODE != $conf['start'] ) { continue; }
470*7d101cc1SGerry Weißbach
471*7d101cc1SGerry Weißbach            $indexTitle = $this->functions->getSiteTitle( $indexSearch );
472*7d101cc1SGerry Weißbach            $indexFile = $indexSearch;
473*7d101cc1SGerry Weißbach            unset($DATA[$NODE]);
474*7d101cc1SGerry Weißbach            break;
475*7d101cc1SGerry Weißbach        }
476*7d101cc1SGerry Weißbach
477*7d101cc1SGerry Weißbach        if ( empty($indexFile) && !empty($DATA[$NODENAME]) ) {
478*7d101cc1SGerry Weißbach            $indexTitle = $this->functions->getSiteTitle( $DATA[$NODENAME] );
479*7d101cc1SGerry Weißbach            $indexFile = $DATA[$NODENAME];
480*7d101cc1SGerry Weißbach            unset($DATA[$NODENAME]);
481*7d101cc1SGerry Weißbach        }
482*7d101cc1SGerry Weißbach
483*7d101cc1SGerry Weißbach        return array($indexTitle, $this->functions->getSiteName($indexFile));
484*7d101cc1SGerry Weißbach    }
485*7d101cc1SGerry Weißbach}
486*7d101cc1SGerry Weißbach
487*7d101cc1SGerry Weißbach?>