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