* @author Modified Paul Minifie */ //#TODO //highlight current page //highlight visitied pages - does a record exist? how does trace work? /** * Display page index * * @author Andreas Gohr * @author Paul Minifie * from html.php */ function html_index_mod ($ns){ require_once(DOKU_INC.'inc/search.php'); global $conf; global $ID; //added for debug global $ACT; global $debug; $dir = $conf['datadir']; $ns = cleanID($ns); #fixme use appropriate function if(empty($ns)){ $ns = dirname(str_replace(':','/',$ID)); if($ns == '.') $ns =''; } $ns = utf8_encodeFN(str_replace(':','/',$ns)); //search_index_title returns an array of arrays, a tree for each of the nodes in the IDX //so split the IDX into components, each of which have level 0, and add each tree to them, before building the list $data =array(); $data1=array(); $pageid=array(); search($data,$conf['datadir'],'search_index_title',array('ns' => $ns)); $IDdisplay=$ID; //TODO obsolete - modify to hide pages with a given suffix //test to see if pagename is a descriptor of an NS and if so, truncate to NS //only happens if 'nspages' is set in local.php and mod is done and flagged in doku.php //if ($conf['amanuensis']['dokunsmod'] and $conf['amanuensis']['nspages']){ // $IDdisplay=$ID; // if (test_nsdescriptor(noNS($ID))==true){ // $IDdisplay = getNS($ID); // } //} //remove pages named the same as the NS //if 'nspages' is set in local.php and mod is done and flagged in doku.php if ($conf['amanuensis']['dokunsmod'] and $conf['amanuensis']['nspages']=='true'){ $data =stripNSdescriptors($data); } //$debug['data'] = $data; $data = build_subindex($data,$IDdisplay); $pageid = diceID($IDdisplay); //$debug['iddice']=$pageid; //sets the spacer that appears in the title of the dropdowns $spacer= array ('id' => ".", 'type' => d, 'level' => 0, 'open' => 1); $pageid = index_dicedID ($pageid); $data1 = array_shift ($data); array_unshift($data1, array_shift($pageid)); $arrlent = count($pageid); $nn=0; while ($nn < $arrlent){ if (($arrlent - $nn) >0){array_push($data1, $spacer);} array_push ($data1, $pageid[$nn] ); $data1 = array_merge ($data1, $data[$nn]); $nn++; } if ($ACT =='edit'){ print html_buildlist_mod($data1,'idx','html_list_index_edit','html_li_index_mod'); }else{ print html_buildlist_mod($data1,'idx','html_list_index_mod','html_li_index_mod'); } } /** * test to see if name is a namespace descriptor ie, is suffixed with '$conf['amanuensis']['nssuffix']' * FIXME make suffix a variable (set in doku.php??) * @author Paul Minifie */ function test_nsdescriptor ($name){ global $conf; if (strpos(strrev($name),strrev($conf['amanuensis']['nssuffix']))===0) { $return=true; }else {$return=false; } return $return; } /** * removes files with the same name as the directory they are in from the dropdown menu * * @author Paul Minifie */ function stripNSdescriptors($data){ //global $debug; $level = 0; $ret=array(); $count=array(); $nslist=array(); //assumes all directories always come before files at a given level, so only does list once //so names of directories added to array. if filenames match, they are discarded //starts by giving each directory an index while ($data){ $item=array_shift($data); $l=$item['level']; if( $l > $level ){ $count[$l]++; } //$item['index']=$count[$l]; if ($item['type']=='d'){ $nslist[$l][$count[$l]][] = noNS($item['id']); array_push($ret,$item); }elseif($item['type']=='f'){ //$debug['count']=$count; //$debug['nslist'] = $nslist; if (is_array ($nslist[$l][$count[$l]])){ if (!in_array(noNS($item['id']),$nslist[$l][$count[$l]])){ array_push($ret,$item); } }else{ array_push($ret,$item); } } //remember current level $level = $l; } return $ret; } /** * takes an index file, array()as returned by * and the IDX, and creates submenus, corresponding to the namespaces * in form array(array(rootnamespace), array(nextlevelnamespace),....array(deepestnamespace) * and marks the namespaces of the current name * * @author Paul Minifie */ function build_subindex($index, $id){ $iddice=array(); $return[0]=$index; $temp = diceID($id); while ($temp){ $iddice[]=noNS(array_shift($temp)); } $level=1; $search = array_shift($iddice).':'; while ($iddice){ $return[$level]=array(); foreach ($return[$level-1] as $item){ //set second bit as component of name if ($search == $item['id']){ $item['open']=$item['open'] & 2; } //reduce level for submenu items if (0 === strpos( $item['id'],$search)){ $item['level']= $item['level']-1; //add item to submenu array_push($return[$level],$item); } } $search .= array_shift($iddice).':'; $level++; } return $return; } /** * dices $ID into array of form that can be output by html_buildlist_mod * Function passed to the search function * * @author Paul Minifie */ function diceID ($id){ $dice = array(); while ($id){ $dice[]=$id; $id=getNS($id); } return array_reverse($dice); } /**NOTUSED * dices $ID into array of form that can be output by html_buildlist_mod * Function passed to the search function * * @author Paul Minifie */ function diceID_old ($id){ $dice = array(); $colon = true; while ($colon) { $colon=strpos($id, ':' ); if ($colon){ $dice[]= substr($id, 0, strpos($id,':')); $id=substr($id, $colon+1); }else{ $dice[]= $id; } } return $dice; } /** * formats a diced $ID into a form that can be built into an index * * @author Paul Minifie */ function index_dicedID ($dicedID){ $return=array(); //FIX_ME this identifies a file as a directory when top level (so the menus work) array_unshift ($return, array('id'=>array_pop($dicedID), 'type'=>'d','level'=>0,'open'=>1)); while ($dicedID){ array_unshift($return, array('id'=>array_pop($dicedID), 'type'=>'d','level'=>0,'open'=>1)); } return $return; } /** * Build the browsable index of pages * * $opts['ns'] is the current namespace * * @author Andreas Gohr * @author Paul Minifie */ function search_index_title(&$data,$base,$file,$type,$lvl,$opts){ global $conf; $return = true; $item = array(); if($type == 'd' && !preg_match('#^'.$file.'(/|$)#','/'.$opts['ns'])){ //add but don't recurse $return = true; }elseif($type == 'f' && !preg_match('#\.txt$#',$file)){ //don't add //modified from andreas' function so return value changed to true in this case, to return the entire index // #FIXME may be possible to do this with the original function if the namespace is not passed return false; } //check ACL $id = pathID($file); if($type=='f' && auth_quickaclcheck($id) < AUTH_READ){ return false; } // dont add namespace descriptors to the list //but only if 'nspages' is set in local.php and mod is done and flagged in doku.php ; if (!($conf['amanuensis']['dokunsmod'] and $conf['amanuensis']['nspages'] and test_nsdescriptor($id))){ $data[]=array( 'id' => $id, 'type' => $type, 'level' => $lvl, 'open' => $return ); } return $return; } /** * Build an unordered list * * Build an unordered list from the given $data array * Each item in the array has to have a 'level' property * the item itself gets printed by the given $func user * function. The second and optional function is used to * print the
  • tag. Both user function need to accept * a single item. * * @author Andreas Gohr . @author Paul Minifie */ function html_buildlist_mod($data,$class,$func,$lifunc='html_li_default',$menuid='menu-h',$menuclass='horizontal'){ //$level set at -1, changed from 0 -pm $level = -1; $level_init= -1; $opens = 0; $ret = ''; $firstul = 1; foreach ($data as $item){ if( $item['level'] > $level ){ //open new list for($i=0; $i<($item['level'] - $level); $i++){ if ($i) $ret .= "
  • \n"; //$changed to set class name to level -pm if ($firstul){ $ret .= "
      \n"; $firstul =NULL; }else{ $ret .= "
        \n"; // class=\"lev$level\">\n"; } } } elseif( $item['level'] < $level ){ //close last item $ret .= "\n"; for ($i=0; $i<($level - $item['level']); $i++){ //close higher lists $ret .= "
      \n\n"; } }else{ //close last item $ret .= "\n"; } //remember current level $level = $item['level']; //print item $ret .= $lifunc($item); //user function //$ret .= '';// class="li">'; $ret .= $func($item); //user function //$ret .= ''; } //close remaining items and lists for ($i=0; $i < $level; $i++){ $ret .= "\n
    \n"; } return $ret; } function html_list_index_mod($item){ $ret = ''; $base = ':'.$item['id']; $base = substr($base,strrpos($base,':')+1); if($item['type']=='d'){ $ret .= ''; $ret .= $base; $ret .= ''; }else{ $ret .= html_wikilink(':'.$item['id']); } return $ret; } /** * In edit mode, builds the links with * * User function for html_buildlist() * * @author Andreas Gohr * @author Paul Minifie */ function html_list_index_edit($item){ $ret = ''; $base = ':'.$item['id']; $base = substr($base,strrpos($base,':')+1); if($item['type']=='d'){ $ret .= ''.noNS($item['id']).''; //$ret .= ''; //$ret .= $base; //$ret .= ''; }else{ $ret .= ''.noNS($item['id']).''; } return $ret; } /** * NOT USED * Index item formatter * * User function for html_buildlist() * * @author Andreas Gohr */ function html_list_index_mod_old($item){ $ret = ''; $base = ':'.$item['id']; $base = substr($base,strrpos($base,':')+1); if($item['type']=='d'){ $ret .= ''; //.'" class="idx_dir">'; $ret .= $base; $ret .= ''; }else{ $ret .= html_wikilink(':'.$item['id']); } return $ret; } /** * NOT USED * Index List item * * This user function is used in html_build_list to build the *
  • tags for namespaces when displaying the page index * it gives different classes to opened or closed "folders" * * @author Andreas Gohr */ function html_li_index_mod($item){ if($item['type'] == "f"){ return '
  • '; // class="level'.$item['level'].'">'; }elseif($item['open']){ return '
  • ';// class="open">'; }else{ return '
  • ';// class="closed">'; } } /** * Default List item, modified to insert a link in edit mode * * @author Andreas Gohr * @author Paul Minifie */ function html_li_edit($item){ return '
  • '; } ?>