17d101cc1SGerry Weißbach<?php 27d101cc1SGerry Weißbach 37d101cc1SGerry Weißbachif (!defined('DOKU_PLUGIN')) die('meh'); 47d101cc1SGerry Weißbach 571925ef6SGerry Weißbachuse dokuwiki\File\PageResolver; 671925ef6SGerry Weißbach 77d101cc1SGerry Weißbachclass siteexport_toc 87d101cc1SGerry Weißbach{ 97d101cc1SGerry Weißbach private $emptyNSToc = true; 107d101cc1SGerry Weißbach private $functions = null; 11a0726238SGerry Weißbach private $NS = null; 127d101cc1SGerry Weißbach public $translation = null; 137d101cc1SGerry Weißbach 14b324a190SMichael Hamann public function __construct($functions, $NS) 157d101cc1SGerry Weißbach { 162c9ab2bbSGerry Weißbach $this->doDebug = !empty($_REQUEST['tocDebug']); 177d101cc1SGerry Weißbach $this->emptyNSToc = !empty($_REQUEST['emptyTocElem']); 187d101cc1SGerry Weißbach $this->functions = $functions; 19a0726238SGerry Weißbach $this->NS = $NS; 207d101cc1SGerry Weißbach } 217d101cc1SGerry Weißbach 226fcbda1dSGerry Weißbach private function isNotEmpty( $val ) { 236fcbda1dSGerry Weißbach return !empty($val); 246fcbda1dSGerry Weißbach } 256fcbda1dSGerry Weißbach 267d101cc1SGerry Weißbach private function shortenByTranslation(&$inputURL, $deepSearch = false) 277d101cc1SGerry Weißbach { 2827464f82SGerry Weißbach // Mandatory: we allways want '/' insteadf of ':' here 2927464f82SGerry Weißbach $inputURL = str_replace(':', '/', $inputURL); 30a8c17ab5Si-net /// software 31a8c17ab5Si-net /// software $checkArray = $this->translation ? $this->translation->translations : array(noNS($this->NS)); 32a0726238SGerry Weißbach 337d101cc1SGerry Weißbach $url = explode('/', $inputURL); 347d101cc1SGerry Weißbach 35cbb6b50eSi-net /// software $URLcount = count($url); 36cbb6b50eSi-net /// software for ($i = 0; $i < $URLcount ; $i++) 377d101cc1SGerry Weißbach { 38a0726238SGerry Weißbach if (in_array($url[$i], $checkArray)) 397d101cc1SGerry Weißbach { 407d101cc1SGerry Weißbach // Rauswerfen und weg 417d101cc1SGerry Weißbach $url[$i] = ''; 427d101cc1SGerry Weißbach break; 437d101cc1SGerry Weißbach } 447d101cc1SGerry Weißbach 457d101cc1SGerry Weißbach if (!$deepSearch) 467d101cc1SGerry Weißbach { 477d101cc1SGerry Weißbach break; 487d101cc1SGerry Weißbach } 497d101cc1SGerry Weißbach 507d101cc1SGerry Weißbach // Ok, remove anyway 517d101cc1SGerry Weißbach $url[$i] = ''; 527d101cc1SGerry Weißbach } 537d101cc1SGerry Weißbach 547d101cc1SGerry Weißbach $inputURL = implode('/', $url); 557d101cc1SGerry Weißbach $inputURL = preg_replace("$\/+$", "/", $inputURL); 567d101cc1SGerry Weißbach 577d101cc1SGerry Weißbach if (strlen($inputURL) > 0 && substr($inputURL, 0, 1) == '/') 587d101cc1SGerry Weißbach { 597d101cc1SGerry Weißbach $inputURL = substr($inputURL, 1); 607d101cc1SGerry Weißbach } 617d101cc1SGerry Weißbach 627d101cc1SGerry Weißbach return $inputURL; 637d101cc1SGerry Weißbach } 647d101cc1SGerry Weißbach 657d101cc1SGerry Weißbach /** 667d101cc1SGerry Weißbach * Build the Java Documentation TOC XML 677d101cc1SGerry Weißbach **/ 687d101cc1SGerry Weißbach public function __getJavaHelpTOCXML($DATA) { 697d101cc1SGerry Weißbach 707d101cc1SGerry Weißbach if (count($DATA) == 0) { 717d101cc1SGerry Weißbach return false; 727d101cc1SGerry Weißbach } 737d101cc1SGerry Weißbach 74e9b60a63SGerry Weißbach $this->debug("#### STARTING ####"); 757d101cc1SGerry Weißbach $TOCXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<toc>"; 767d101cc1SGerry Weißbach $MAPXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<map version=\"1.0\">"; 777d101cc1SGerry Weißbach 787d101cc1SGerry Weißbach // Go through the pages 797d101cc1SGerry Weißbach $CHECKDATA = array(); 807d101cc1SGerry Weißbach $nData = $DATA; 817d101cc1SGerry Weißbach $DATA = array(); 827d101cc1SGerry Weißbach $check = array(); 837d101cc1SGerry Weißbach $startPageID = null; 847d101cc1SGerry Weißbach 857d101cc1SGerry Weißbach foreach ( $nData as $elem ) 867d101cc1SGerry Weißbach { 877d101cc1SGerry Weißbach // Check if available 887d101cc1SGerry Weißbach $anchor = ( !empty($elem['anchor']) ? '#' . $elem['anchor'] : '' ); 89d9cefbd9SGerry Weißbach $elem['url'] = $this->functions->getSiteName($elem['id'], true); // Override - we need a clean name 907d101cc1SGerry Weißbach $elem['mapURL'] = $elem['url']; 917d101cc1SGerry Weißbach $this->shortenByTranslation($elem['url']); 927d101cc1SGerry Weißbach 937d101cc1SGerry Weißbach // only add an url once 947d101cc1SGerry Weißbach if ( in_array($elem['url'], $CHECKDATA) ) { continue; } 957d101cc1SGerry Weißbach 96dfb6ef8fSGerry Weißbach if ( !isset($elem['exists']) ) { 973354083fSGerry Weißbach $elem['exists'] = page_exists( (new PageResolver( $elem['id'] ))->resolveId($elem['id']) ); 98dfb6ef8fSGerry Weißbach $this->functions->debug->message("EXISTS previously not set.", $elem, 1); 99dfb6ef8fSGerry Weißbach } 100dfb6ef8fSGerry Weißbach 1017d101cc1SGerry Weißbach // if not there, no map ids will be generated 1028a20a4b4SGerry Weißbach $elem['mapID'] = intval($elem['exists']) == 1 ? $this->functions->getMapID($elem['id'], $elem['anchor'], $check) : array(); 1036fcbda1dSGerry Weißbach $elem['tags'] = explode(' ', p_get_metadata($elem['id'], 'context tags', true)); // thats from the tag plugin 1046fcbda1dSGerry Weißbach $elem['tags'] = array_filter($elem['tags'], array($this, 'isNotEmpty')); 1056fcbda1dSGerry Weißbach $elem['tags'] = array_map(array($this->functions, 'cleanId'), $elem['tags']); 1067d101cc1SGerry Weißbach 1070571ece2SScrutinizer Auto-Fixer if ( empty($elem['depth']) ) { 1080571ece2SScrutinizer Auto-Fixer $elem['depth'] = count(explode('/', $elem['url'])); 1090571ece2SScrutinizer Auto-Fixer } 1107d101cc1SGerry Weißbach $CHECKDATA[] = $elem['url']; 1117d101cc1SGerry Weißbach 1127d101cc1SGerry Weißbach if ( $startPageID == null ) 1137d101cc1SGerry Weißbach { 1147d101cc1SGerry Weißbach $startPageID = $elem['mapID'][0]; 1157d101cc1SGerry Weißbach } 1167d101cc1SGerry Weißbach 117*5c175589SGerry Weißbach // Only overwrite name when none was provided (e.g. link without title). 118*5c175589SGerry Weißbach // When the toc link has an explicit title (e.g. [[.:configuration|configuration]]), keep it 119*5c175589SGerry Weißbach // so the tocitem target stays lowercased and matches map.xml convention. 120*5c175589SGerry Weißbach if ( empty( $elem['name'] ) ) { 1216ba764b8SGerry Weißbach $elem['name'] = $this->functions->getSiteTitle($elem['id']); 122ddfb25f1SGerry Weißbach 123ddfb25f1SGerry Weißbach if ( is_array($elem['mapID']) && empty( $elem['mapID'] ) ) { 124ddfb25f1SGerry Weißbach array_push($elem['mapID'], noNs($elem['id'])); 125ddfb25f1SGerry Weißbach } 126ddfb25f1SGerry Weißbach 127ddfb25f1SGerry Weißbach $this->debug("no name, get site title " . $elem['name']); 12813aaf300SGerry Weißbach $this->debug($elem); 1296ba764b8SGerry Weißbach } 1306ba764b8SGerry Weißbach 1317d101cc1SGerry Weißbach // Go on building mapXML 1327d101cc1SGerry Weißbach $this->shortenByTranslation($elem['mapURL'], true); // true to already remove all language stuff - false if not 1337d101cc1SGerry Weißbach foreach ( $elem['mapID'] as $VIEWID ) { 1346fcbda1dSGerry Weißbach $MAPXML .= "\n\t<mapID target=\"" . $VIEWID . "\" url=\"" . $elem['mapURL'] . $anchor . "\"/>"; 1357d101cc1SGerry Weißbach } 1367d101cc1SGerry Weißbach 1377d101cc1SGerry Weißbach $elem['tocNS'] = getNS(cleanID($elem['url'])); 1382c9ab2bbSGerry Weißbach $elem['tocNS'] = $this->shortenByTranslation($elem['tocNS'], true); 1392c9ab2bbSGerry Weißbach $elem['tocNS'] = strlen($elem['tocNS']) > 0 ? explode('/', $elem['tocNS']) : array(); 1406ba764b8SGerry Weißbach $this->functions->debug->message("This will be the TOC elements data:", $elem, 1); 1417d101cc1SGerry Weißbach 1427d101cc1SGerry Weißbach $this->__buildTOCTree($DATA, $elem['tocNS'], $elem); 1437d101cc1SGerry Weißbach } 1447d101cc1SGerry Weißbach 14513aaf300SGerry Weißbach $this->debug("#### Writing TOC Tree ####"); 1467d101cc1SGerry Weißbach $TOCXML .= $this->__writeTOCTree($DATA) . "\n</toc>"; 14713aaf300SGerry Weißbach $this->debug("#### DONE: Writing TOC Tree ####"); 1487d101cc1SGerry Weißbach $MAPXML .= "\n</map>"; 14901a1f586SGerry Weißbach 1502c9ab2bbSGerry Weißbach $this->debug($DATA); 1512c9ab2bbSGerry Weißbach $this->debug($TOCXML); 1523bda080dSGerry Weißbach $this->debug($MAPXML); 1537d101cc1SGerry Weißbach 1547d101cc1SGerry Weißbach return array($TOCXML, $MAPXML, $startPageID); 1557d101cc1SGerry Weißbach } 1567d101cc1SGerry Weißbach 1577d101cc1SGerry Weißbach /** 1587d101cc1SGerry Weißbach * Prepare the TOC Tree 1597d101cc1SGerry Weißbach **/ 1607d101cc1SGerry Weißbach private function __buildTOCTree(&$DATA, $currentNSArray, $elemToAdd) 1617d101cc1SGerry Weißbach { 1627d101cc1SGerry Weißbach global $conf; 1637d101cc1SGerry Weißbach 1642c9ab2bbSGerry Weißbach // Actual level 1652c9ab2bbSGerry Weißbach if (empty($currentNSArray)) { 16624b1b4baSGerry Weißbach $elemToAdd['isStartPage'] = noNS($elemToAdd['id']) == $conf['start']; 16751917f25SGerry Weißbach // $key = empty($elemToAdd['name']) || 1==1 ? noNS($elemToAdd['id']) : $elemToAdd['name']; 1680965d97cSGerry Weißbach $key = noNS($elemToAdd['id']); 1690965d97cSGerry Weißbach $DATA[$key] = $elemToAdd; 1707d101cc1SGerry Weißbach return; 1717d101cc1SGerry Weißbach } 1727d101cc1SGerry Weißbach 1737d101cc1SGerry Weißbach $currentLevel = array_shift($currentNSArray); 17401a1f586SGerry Weißbach $nextLevel = &$DATA[$currentLevel]; 17501a1f586SGerry Weißbach if (empty($nextLevel)) { 1762c9ab2bbSGerry Weißbach $nextLevel = array('pages' => array()); 17701a1f586SGerry Weißbach } else { 17801a1f586SGerry Weißbach $nextLevel = &$DATA[$currentLevel]['pages']; 1797d101cc1SGerry Weißbach } 1807d101cc1SGerry Weißbach 18101a1f586SGerry Weißbach $this->__buildTOCTree($nextLevel, $currentNSArray, $elemToAdd); 1827d101cc1SGerry Weißbach } 1837d101cc1SGerry Weißbach 1847d101cc1SGerry Weißbach /** 1857d101cc1SGerry Weißbach * Create a single TOC Item 1867d101cc1SGerry Weißbach **/ 1877d101cc1SGerry Weißbach private function __TOCItem($item, $depth, $selfClosed = true) 1887d101cc1SGerry Weißbach { 18964008c75SGerry Weißbach $this->debug("creating toc item"); 19013aaf300SGerry Weißbach $this->debug($item); 191de71facaSGerry Weißbach $targetID = $item['mapID'][0] ?? ''; 1927d101cc1SGerry Weißbach if (empty($targetID)) { 193045da2c8SGerry Weißbach $targetID = $this->functions->cleanID($item['name']); 19464008c75SGerry Weißbach $this->debug("no map ID, using: " . $targetID); 1957d101cc1SGerry Weißbach } 196dbc4346dSGerry Weißbach return "\n" . str_repeat("\t", max($depth, 0)+1) . "<tocitem target=\"" . $targetID . "\"" . (intval($item['exists']) == 1 ? " text=\"" . $item['name'] . "\"" : "") . ( array_key_exists('tags', $item) && !empty($item['tags']) ? " tags=\"" . implode(' ', $item['tags']) . "\"": "") . ($selfClosed ? '/' : '') . ">"; 1977d101cc1SGerry Weißbach } 1987d101cc1SGerry Weißbach 1997d101cc1SGerry Weißbach /** 2007d101cc1SGerry Weißbach * Create a single TOC Item 2017d101cc1SGerry Weißbach **/ 2027d101cc1SGerry Weißbach private function __TOCItemClose($depth) 2037d101cc1SGerry Weißbach { 2047d101cc1SGerry Weißbach return "\n" . str_repeat("\t", max($depth, 0)+1) . "</tocitem>"; 2057d101cc1SGerry Weißbach } 2067d101cc1SGerry Weißbach 2077d101cc1SGerry Weißbach /** 2087d101cc1SGerry Weißbach * Write the whole TOC TREE 2097d101cc1SGerry Weißbach **/ 2107d101cc1SGerry Weißbach private function __writeTOCTree($CURRENTNODE, $CURRENTNODENAME = null, $DEPTH = 0) { 2117d101cc1SGerry Weißbach global $conf; 2127d101cc1SGerry Weißbach 2137d101cc1SGerry Weißbach $XML = ''; 2147d101cc1SGerry Weißbach $didOpenItem = false; 2157d101cc1SGerry Weißbach if (!is_array($CURRENTNODE) || empty($CURRENTNODE)) 2167d101cc1SGerry Weißbach { 2177d101cc1SGerry Weißbach // errr … no. 2187d101cc1SGerry Weißbach return $XML; 2197d101cc1SGerry Weißbach } 2207d101cc1SGerry Weißbach 2217d101cc1SGerry Weißbach // This is an element! 222f3b52d8fSGerry Weißbach if (!empty($CURRENTNODE['id']) && empty($CURRENTNODE['pages'])) 2237d101cc1SGerry Weißbach { 224f3b52d8fSGerry Weißbach // This has to be an item - only -! 2257d101cc1SGerry Weißbach return $this->__TOCItem($CURRENTNODE, $DEPTH); 2267d101cc1SGerry Weißbach } 2277d101cc1SGerry Weißbach 2287d101cc1SGerry Weißbach // Look for start page 2297d101cc1SGerry Weißbach if (!empty($CURRENTNODE[$conf['start']])) 2307d101cc1SGerry Weißbach { 2317d101cc1SGerry Weißbach // YAY! StartPage found. 23201a1f586SGerry Weißbach $didOpenItem = !(count(empty($CURRENTNODE['pages']) ? $CURRENTNODE : $CURRENTNODE['pages']) == 0); 2337d101cc1SGerry Weißbach $XML .= $this->__TOCItem($CURRENTNODE[$conf['start']], $DEPTH, !$didOpenItem); 2347d101cc1SGerry Weißbach unset($CURRENTNODE[$conf['start']]); 23501a1f586SGerry Weißbach } else if (!empty($CURRENTNODE['element'])) { 23601a1f586SGerry Weißbach $didOpenItem = !(count($CURRENTNODE['pages']) == 0); 23701a1f586SGerry Weißbach $XML .= $this->__TOCItem($CURRENTNODE['element'], $DEPTH, !$didOpenItem); 23801a1f586SGerry Weißbach unset($CURRENTNODE['element']); 2397d101cc1SGerry Weißbach } else if ($CURRENTNODENAME != null) { 2407d101cc1SGerry Weißbach // We have a parent node for what is comming … lets honor that 2417d101cc1SGerry Weißbach $didOpenItem = !(count($CURRENTNODE) == 0); 24264008c75SGerry Weißbach $XML .= $this->__TOCItem(array('name' => $CURRENTNODENAME), $DEPTH, !$didOpenItem); 2437d101cc1SGerry Weißbach } else { 2447d101cc1SGerry Weißbach // Woohoo … empty node? do not count up! 2457d101cc1SGerry Weißbach $DEPTH--; 2467d101cc1SGerry Weißbach } 2477d101cc1SGerry Weißbach 2483bda080dSGerry Weißbach $this->debug("-- This is the current node --"); 2493bda080dSGerry Weißbach $this->debug($CURRENTNODE); 2503bda080dSGerry Weißbach 2517d101cc1SGerry Weißbach // Circle through the entries 25201a1f586SGerry Weißbach foreach (empty($CURRENTNODE['pages']) ? $CURRENTNODE : $CURRENTNODE['pages'] as $NODENAME => $ELEM) 2537d101cc1SGerry Weißbach { 2547d101cc1SGerry Weißbach // a node should have more than only one entry … otherwise we will not tell our name! 25513aaf300SGerry Weißbach $XML .= $this->__writeTOCTree($ELEM, count($ELEM) >= 1 ? ( !empty($ELEM['name']) ? $ELEM['name'] : $NODENAME ) : null, $DEPTH+1); 2567d101cc1SGerry Weißbach } 2577d101cc1SGerry Weißbach 2587d101cc1SGerry Weißbach // Close and return 2597d101cc1SGerry Weißbach return $XML . ($didOpenItem ? $this->__TOCItemClose($DEPTH) : ''); 2607d101cc1SGerry Weißbach } 2617d101cc1SGerry Weißbach 2627d101cc1SGerry Weißbach /** 2637d101cc1SGerry Weißbach * Build the Eclipse Documentation TOC XML 2647d101cc1SGerry Weißbach **/ 2657d101cc1SGerry Weißbach public function __getTOCXML($DATA, $XML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?NLS TYPE=\"org.eclipse.help.toc\"?>\n") { 2667d101cc1SGerry Weißbach 2677d101cc1SGerry Weißbach $pagesArray = array(); 2687d101cc1SGerry Weißbach 2697d101cc1SGerry Weißbach // Go through the pages 2707d101cc1SGerry Weißbach foreach ($DATA as $elem) { 2717d101cc1SGerry Weißbach 2727d101cc1SGerry Weißbach $site = $elem['id']; 2737d101cc1SGerry Weißbach $elems = explode('/', $this->functions->getSiteName($site)); 2747d101cc1SGerry Weißbach 2757d101cc1SGerry Weißbach // Strip Site 2767d101cc1SGerry Weißbach array_pop($elems); 2777d101cc1SGerry Weißbach 2787d101cc1SGerry Weißbach // build the topic Tree 2797d101cc1SGerry Weißbach $this->__buildTopicTree($pagesArray, $elems, $site); 2807d101cc1SGerry Weißbach } 2817d101cc1SGerry Weißbach 2827d101cc1SGerry Weißbach $XML .= $this->__addXMLTopic($pagesArray, 'toc'); 2837d101cc1SGerry Weißbach 2847d101cc1SGerry Weißbach return $XML; 2857d101cc1SGerry Weißbach 2867d101cc1SGerry Weißbach } 2877d101cc1SGerry Weißbach 2887d101cc1SGerry Weißbach /** 2897d101cc1SGerry Weißbach * Load the topic Tree for the TOC - recursive 2907d101cc1SGerry Weißbach **/ 2917d101cc1SGerry Weißbach private function __buildTopicTree(&$PAGES, $DATA, $SITE, $INSERTDATA = null) { 2927d101cc1SGerry Weißbach 2937d101cc1SGerry Weißbach if (empty($DATA) || !is_array($DATA)) { 2947d101cc1SGerry Weißbach 2957d101cc1SGerry Weißbach if ($INSERTDATA == null) 2967d101cc1SGerry Weißbach { 2977d101cc1SGerry Weißbach $INSERTDATA = $SITE; 2987d101cc1SGerry Weißbach } 2997d101cc1SGerry Weißbach 3007d101cc1SGerry Weißbach // This is already a namespace 3017d101cc1SGerry Weißbach if (is_array($PAGES[noNS($SITE)])) { 3027d101cc1SGerry Weißbach // The root already exists! 3037d101cc1SGerry Weißbach if (!empty($PAGES[noNS($SITE)][noNS($SITE)])) { 3047d101cc1SGerry Weißbach if (strstr($PAGES[noNS($SITE)][noNS($SITE)], $SITE)) { 3057d101cc1SGerry Weißbach // The SITE is in the parent Namespace, and the current Namespace has an index with same name 3067d101cc1SGerry Weißbach $PAGES['__' . noNS($SITE)] = $INSERTDATA; 3077d101cc1SGerry Weißbach } else { 3087d101cc1SGerry Weißbach $PAGES['__' . noNS($SITE)] = $PAGES[noNS($SITE)][noNS($SITE)]; 3097d101cc1SGerry Weißbach $PAGES[noNS($SITE)][noNS($SITE)] = $INSERTDATA; 3107d101cc1SGerry Weißbach } 3117d101cc1SGerry Weißbach } else { 3127d101cc1SGerry Weißbach $PAGES[noNS($SITE)][noNS($SITE)] = $INSERTDATA; 3137d101cc1SGerry Weißbach } 3147d101cc1SGerry Weißbach } else { 3157d101cc1SGerry Weißbach // just a Page 3167d101cc1SGerry Weißbach $PAGES[noNS($SITE)] = $INSERTDATA; 3177d101cc1SGerry Weißbach } 3187d101cc1SGerry Weißbach return; 3197d101cc1SGerry Weißbach } 3207d101cc1SGerry Weißbach 3217d101cc1SGerry Weißbach $NS = array_shift($DATA); 3227d101cc1SGerry Weißbach if (!is_array($PAGES[$NS])) $PAGES[$NS] = empty($PAGES[$NS]) ? array() : array($PAGES[$NS]); 3237d101cc1SGerry Weißbach $this->__buildTopicTree($PAGES[$NS], $DATA, $SITE, $INSERTDATA); 3247d101cc1SGerry Weißbach 3257d101cc1SGerry Weißbach return; 3267d101cc1SGerry Weißbach } 3277d101cc1SGerry Weißbach 3287d101cc1SGerry Weißbach /** 3297d101cc1SGerry Weißbach * Build the Topic Tree for TOC.xml 3307d101cc1SGerry Weißbach **/ 3317d101cc1SGerry Weißbach private function __addXMLTopic($DATA, $ITEM = 'topic', $LEVEL = 0, $NODENAME = '') { 3327d101cc1SGerry Weißbach global $conf; 3337d101cc1SGerry Weißbach 3347d101cc1SGerry Weißbach $DEPTH = str_repeat("\t", $LEVEL); 3357d101cc1SGerry Weißbach 3367d101cc1SGerry Weißbach if (!is_array($DATA)) { 3377d101cc1SGerry Weißbach return $DEPTH . '<' . $ITEM . ' label="' . $this->functions->getSiteTitle($DATA) . '" ' . ($ITEM != 'topic' ? 'topic' : 'href') . '="' . $this->functions->getSiteName($DATA) . "\" />\n"; 3387d101cc1SGerry Weißbach } 3397d101cc1SGerry Weißbach // Is array from this point on 3407d101cc1SGerry Weißbach list($indexTitle, $indexFile) = $this->__getIndexItem($DATA, $NODENAME); 3417d101cc1SGerry Weißbach 3427d101cc1SGerry Weißbach if (empty($indexTitle)) $indexTitle = $this->functions->getSiteTitle($conf['start']); 3437d101cc1SGerry Weißbach if (!empty($indexFile)) $indexFile = ($ITEM != 'topic' ? 'topic' : 'href') . "=\"$indexFile\""; 3447d101cc1SGerry Weißbach 3457d101cc1SGerry Weißbach $isEmptyNode = count($DATA) == 1 && empty($indexFile); 3467d101cc1SGerry Weißbach 347a8c17ab5Si-net /// software if (!$isEmptyNode && ($this->emptyNSToc || count($DATA) > 0)) { 3487d101cc1SGerry Weißbach $XML = "$DEPTH<$ITEM label=\"$indexTitle\" $indexFile>"; 349a8c17ab5Si-net /// software } else { 350a8c17ab5Si-net /// software $XML = ""; 351a8c17ab5Si-net /// software } 3527d101cc1SGerry Weißbach 3537d101cc1SGerry Weißbach if (!$isEmptyNode && count($DATA) > 0) $XML .= "\n"; 3547d101cc1SGerry Weißbach 3557d101cc1SGerry Weißbach foreach ($DATA as $NODENAME => $NS) { 3567d101cc1SGerry Weißbach $XML .= $this->__addXMLTopic($NS, (!($this->emptyNSToc || count($DATA) > 1) && $ITEM != 'topic' ? $ITEM : 'topic'), $LEVEL+(!$isEmptyNode ? 1 : 0), $NODENAME); 3577d101cc1SGerry Weißbach } 3587d101cc1SGerry Weißbach 3597d101cc1SGerry Weißbach if (!$isEmptyNode && count($DATA) > 0) $XML .= "$DEPTH"; 3607d101cc1SGerry Weißbach if (!$isEmptyNode && ($this->emptyNSToc || count($DATA) > 0)) { 3617d101cc1SGerry Weißbach $XML .= "</$ITEM>\n"; 3627d101cc1SGerry Weißbach } 3637d101cc1SGerry Weißbach 3647d101cc1SGerry Weißbach return $XML; 3657d101cc1SGerry Weißbach } 3667d101cc1SGerry Weißbach 3677d101cc1SGerry Weißbach 3687d101cc1SGerry Weißbach /** 3697d101cc1SGerry Weißbach * Get the context XML 3707d101cc1SGerry Weißbach **/ 3717d101cc1SGerry Weißbach public function __getContextXML($DATA) { 3727d101cc1SGerry Weißbach 3737d101cc1SGerry Weißbach $XML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<?NLS TYPE=\"org.eclipse.help.context\"?>\n<contexts>\n"; 3747d101cc1SGerry Weißbach 3757d101cc1SGerry Weißbach $check = array(); 3767d101cc1SGerry Weißbach foreach ($DATA as $elem) 3777d101cc1SGerry Weißbach { 3787d101cc1SGerry Weißbach $ID = $elem['id']; 3797d101cc1SGerry Weißbach $meta = p_get_metadata($ID, 'context', true); 3807d101cc1SGerry Weißbach if (empty($meta['id'])) { continue; } 3817d101cc1SGerry Weißbach 3827d101cc1SGerry Weißbach $TITLE = empty($meta['title']) ? $this->functions->getSiteTitle($ID) : $meta['title']; 3837d101cc1SGerry Weißbach 3847d101cc1SGerry Weißbach // support more than one view IDs ... for more than one reference 3858a20a4b4SGerry Weißbach $VIEWIDs = $this->functions->getMapID($elem['id'], $elem['anchor'], $check); 3867d101cc1SGerry Weißbach 3877d101cc1SGerry Weißbach $DESCRIPTION = $this->functions->xmlEntities(p_get_metadata($ID, 'description abstract')); 3887d101cc1SGerry Weißbach 3897d101cc1SGerry Weißbach // Build topic Links 3907d101cc1SGerry Weißbach $url = $this->functions->getSiteName($ID); 3917d101cc1SGerry Weißbach $this->shortenByTranslation($url); 3927d101cc1SGerry Weißbach 3937d101cc1SGerry Weißbach $TOPICS = array($url => $TITLE . " (Details)"); 3947d101cc1SGerry Weißbach $REFS = p_get_metadata($ID, 'relation references', true); 3957d101cc1SGerry Weißbach if (is_array($REFS)) 3967d101cc1SGerry Weißbach foreach ($REFS as $REL => $EXISTS) { 3977d101cc1SGerry Weißbach if (!$EXISTS) { continue; } 3987d101cc1SGerry Weißbach $TOPICS[$this->functions->getSiteName($REL)] = $this->functions->getSiteTitle($REL); 3997d101cc1SGerry Weißbach } 4007d101cc1SGerry Weißbach 4017d101cc1SGerry Weißbach // build XML - include multi view IDs 4027d101cc1SGerry Weißbach foreach ($VIEWIDs as $VIEWID) { 4037d101cc1SGerry Weißbach $XML .= "\t<context id=\"$VIEWID\" title=\"$TITLE\">\n"; 4047d101cc1SGerry Weißbach $XML .= "\t\t<description>$DESCRIPTION</description>\n"; 4057d101cc1SGerry Weißbach 4067d101cc1SGerry Weißbach foreach ($TOPICS as $URL => $LABEL) { 4077d101cc1SGerry Weißbach $XML .= "\t\t<topic label=\"$LABEL\" href=\"$URL\" />\n"; 4087d101cc1SGerry Weißbach } 4097d101cc1SGerry Weißbach 4107d101cc1SGerry Weißbach $XML .= "\t</context>\n"; 4117d101cc1SGerry Weißbach } 4127d101cc1SGerry Weißbach } 4137d101cc1SGerry Weißbach 4147d101cc1SGerry Weißbach $XML .= "</contexts>"; 4157d101cc1SGerry Weißbach return $XML; 4167d101cc1SGerry Weißbach 4177d101cc1SGerry Weißbach } 4187d101cc1SGerry Weißbach 4197d101cc1SGerry Weißbach /** 4207d101cc1SGerry Weißbach * Determine if this is an index - and if so, find its Title 4217d101cc1SGerry Weißbach **/ 4227d101cc1SGerry Weißbach private function __getIndexItem(&$DATA, $NODENAME = '') { 4237d101cc1SGerry Weißbach global $conf; 4247d101cc1SGerry Weißbach 4257d101cc1SGerry Weißbach if (!is_array($DATA)) { return; } 4267d101cc1SGerry Weißbach 4277d101cc1SGerry Weißbach $indexTitle = ''; 4287d101cc1SGerry Weißbach $indexFile = ''; 4297d101cc1SGerry Weißbach foreach ($DATA as $NODE => $indexSearch) { 4307d101cc1SGerry Weißbach // Skip next Namespaces 4317d101cc1SGerry Weißbach if (is_array($indexSearch)) { continue; } 4327d101cc1SGerry Weißbach 4337d101cc1SGerry Weißbach // Skip if this is not a start 4347d101cc1SGerry Weißbach if ($NODE != $conf['start']) { continue; } 4357d101cc1SGerry Weißbach 4367d101cc1SGerry Weißbach $indexTitle = $this->functions->getSiteTitle($indexSearch); 4377d101cc1SGerry Weißbach $indexFile = $indexSearch; 4387d101cc1SGerry Weißbach unset($DATA[$NODE]); 4397d101cc1SGerry Weißbach break; 4407d101cc1SGerry Weißbach } 4417d101cc1SGerry Weißbach 4427d101cc1SGerry Weißbach if (empty($indexFile) && !empty($DATA[$NODENAME])) { 4437d101cc1SGerry Weißbach $indexTitle = $this->functions->getSiteTitle($DATA[$NODENAME]); 4447d101cc1SGerry Weißbach $indexFile = $DATA[$NODENAME]; 4457d101cc1SGerry Weißbach unset($DATA[$NODENAME]); 4467d101cc1SGerry Weißbach } 4477d101cc1SGerry Weißbach 4487d101cc1SGerry Weißbach return array($indexTitle, $this->functions->getSiteName($indexFile)); 4497d101cc1SGerry Weißbach } 4502c9ab2bbSGerry Weißbach 4512c9ab2bbSGerry Weißbach private $doDebug = false; 4522c9ab2bbSGerry Weißbach private static $didDebug = false; 4533bda080dSGerry Weißbach public function debug($data, $final = false) { 4542c9ab2bbSGerry Weißbach if ( ! $this->doDebug ) { return; } 4552c9ab2bbSGerry Weißbach 4562c9ab2bbSGerry Weißbach if ( !$this->didDebug ) { 4572c9ab2bbSGerry Weißbach print "<html><pre>"; 4582c9ab2bbSGerry Weißbach $this->didDebug = true; 4597d101cc1SGerry Weißbach } 4607d101cc1SGerry Weißbach 4612c9ab2bbSGerry Weißbach if ( is_array($data) ) { 4622c9ab2bbSGerry Weißbach print_r($data); 4632c9ab2bbSGerry Weißbach } else { 4642c9ab2bbSGerry Weißbach print str_replace("<", "<", str_replace(">", ">", $data));; 4652c9ab2bbSGerry Weißbach } 4662c9ab2bbSGerry Weißbach 4672c9ab2bbSGerry Weißbach print "\n\n"; 4682c9ab2bbSGerry Weißbach 4692c9ab2bbSGerry Weißbach if ( $final ) { 4702c9ab2bbSGerry Weißbach print "</pre></html>"; 4712c9ab2bbSGerry Weißbach exit; 4722c9ab2bbSGerry Weißbach } 4732c9ab2bbSGerry Weißbach } 4742c9ab2bbSGerry Weißbach} 475