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("<", "<", str_replace(">", ">", $TOCXML)); 124*7d101cc1SGerry Weißbach print "$TOCXML"; 125*7d101cc1SGerry Weißbach 126*7d101cc1SGerry Weißbach $MAPXML = str_replace("<", "<", str_replace(">", ">", $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?>