17Syaroslav@ivinco.com<?php 27Syaroslav@ivinco.com/* 37Syaroslav@ivinco.com * To change this template, choose Tools | Templates 47Syaroslav@ivinco.com * and open the template in the editor. 57Syaroslav@ivinco.com */ 67Syaroslav@ivinco.com 77Syaroslav@ivinco.comfunction formatXml($data) 87Syaroslav@ivinco.com{ 97Syaroslav@ivinco.com $xmlFormat = ' 107Syaroslav@ivinco.com<sphinx:document id="{id}"> 117Syaroslav@ivinco.com<title><![CDATA[[{title}]]></title> 127Syaroslav@ivinco.com<body><![CDATA[[{body}]]></body> 137Syaroslav@ivinco.com<categories><![CDATA[[{categories}]]></categories> 147Syaroslav@ivinco.com<level>{level}</level> 157Syaroslav@ivinco.com<modified>{modified}</modified> 167Syaroslav@ivinco.com</sphinx:document> 177Syaroslav@ivinco.com 187Syaroslav@ivinco.com'; 197Syaroslav@ivinco.com 2012Syaroslav@ivinco.com return str_replace( array('{id}', '{title}', '{body}', '{categories}', '{level}', '{modified}'), 217Syaroslav@ivinco.com array($data['id'], $data['title'], $data['body'], $data['categories'], 2212Syaroslav@ivinco.com $data['level'], $data['modified']), 237Syaroslav@ivinco.com $xmlFormat 247Syaroslav@ivinco.com ); 257Syaroslav@ivinco.com} 267Syaroslav@ivinco.com 277Syaroslav@ivinco.comfunction getDocumentsByHeadings($id, $metadata) 287Syaroslav@ivinco.com{ 297Syaroslav@ivinco.com if (empty($metadata) || empty($metadata['description']['tableofcontents'])) return false; 307Syaroslav@ivinco.com 317Syaroslav@ivinco.com $sections = array(); 3219Syaroslav@ivinco.com $level = 1; 3319Syaroslav@ivinco.com $previouse_title = ''; 347Syaroslav@ivinco.com foreach($metadata['description']['tableofcontents'] as $row){ 357Syaroslav@ivinco.com $sections[$row['hid']] = array( 36*20Syaroslav@ivinco.com 'section' => getSectionByTitleLevel($id, $row['title']), 37*20Syaroslav@ivinco.com //'section' => getSection($id, $row['title']), 3819Syaroslav@ivinco.com 'level' => $row['level'], 3919Syaroslav@ivinco.com 'title' => $row['title'] 407Syaroslav@ivinco.com ); 4119Syaroslav@ivinco.com if ($row['level'] > $level){ 4219Syaroslav@ivinco.com $sections[$row['hid']]['title_text'] = $previouse_title . " » ".$row['title']; 4319Syaroslav@ivinco.com } else { 4419Syaroslav@ivinco.com $sections[$row['hid']]['title_text'] = $row['title']; 4519Syaroslav@ivinco.com $previouse_title = $row['title']; 4619Syaroslav@ivinco.com } 47*20Syaroslav@ivinco.com //echo $sections[$row['hid']]['title_text']."\n"; 48*20Syaroslav@ivinco.com //echo $sections[$row['hid']]['section']; 497Syaroslav@ivinco.com } 50*20Syaroslav@ivinco.com //exit; 517Syaroslav@ivinco.com return $sections; 527Syaroslav@ivinco.com} 537Syaroslav@ivinco.com 54*20Syaroslav@ivinco.comfunction getSectionByTitleLevel($id, $header) 55*20Syaroslav@ivinco.com{ 56*20Syaroslav@ivinco.com $headerReg = preg_quote($header, '/'); 57*20Syaroslav@ivinco.com $doc = io_readFile(wikiFN($id)); 58*20Syaroslav@ivinco.com $regex = "(={1,6})\s*({$headerReg})\s*(={1,6})"; 59*20Syaroslav@ivinco.com $section = ''; 60*20Syaroslav@ivinco.com if (preg_match("/$regex/i",$doc,$matches)) { 61*20Syaroslav@ivinco.com $startHeader = $matches[0]; 62*20Syaroslav@ivinco.com $startHeaderPos = strpos($doc, $startHeader) + strlen($startHeader); 63*20Syaroslav@ivinco.com $endDoc = substr($doc, $startHeaderPos); 64*20Syaroslav@ivinco.com 65*20Syaroslav@ivinco.com $regex = '(={1,6})(.*?)(={1,6})'; 66*20Syaroslav@ivinco.com if (preg_match("/$regex/i",$endDoc,$matches)) { 67*20Syaroslav@ivinco.com $endHeader = $matches[0]; 68*20Syaroslav@ivinco.com $endHeaderPos = strpos($doc, $endHeader); 69*20Syaroslav@ivinco.com } else { 70*20Syaroslav@ivinco.com $endHeaderPos = 0; 71*20Syaroslav@ivinco.com } 72*20Syaroslav@ivinco.com if ($endHeaderPos){ 73*20Syaroslav@ivinco.com $section = substr($doc, $startHeaderPos, $endHeaderPos - $startHeaderPos); 74*20Syaroslav@ivinco.com } else { 75*20Syaroslav@ivinco.com $section = substr($doc, $startHeaderPos); 76*20Syaroslav@ivinco.com } 77*20Syaroslav@ivinco.com } 78*20Syaroslav@ivinco.com $section = trim($section); 79*20Syaroslav@ivinco.com //trying to get next section content if body for first section found 80*20Syaroslav@ivinco.com if (!$section){ 81*20Syaroslav@ivinco.com $startHeaderPos = $endHeaderPos + strlen($endHeader); 82*20Syaroslav@ivinco.com $endDoc = substr($endDoc, $startHeaderPos); 83*20Syaroslav@ivinco.com $regex = '(={1,6})(.*?)(={1,6})'; 84*20Syaroslav@ivinco.com if (preg_match("/$regex/i",$endDoc,$matches)) { 85*20Syaroslav@ivinco.com $endHeader = $matches[0]; 86*20Syaroslav@ivinco.com $endHeaderPos = strpos($doc, $endHeader); 87*20Syaroslav@ivinco.com } else { 88*20Syaroslav@ivinco.com $endHeaderPos = 0; 89*20Syaroslav@ivinco.com } 90*20Syaroslav@ivinco.com if ($endHeaderPos){ 91*20Syaroslav@ivinco.com $section = substr($doc, $startHeaderPos, $endHeaderPos - $startHeaderPos); 92*20Syaroslav@ivinco.com } else { 93*20Syaroslav@ivinco.com $section = substr($doc, $startHeaderPos); 94*20Syaroslav@ivinco.com } 95*20Syaroslav@ivinco.com } 96*20Syaroslav@ivinco.com return $section; 97*20Syaroslav@ivinco.com} 98*20Syaroslav@ivinco.com 997Syaroslav@ivinco.comfunction getSection($id, $header) 1007Syaroslav@ivinco.com{ 10117Syaroslav@ivinco.com static $cacheInstructions = null; 10217Syaroslav@ivinco.com static $cacheDoc = null; 10317Syaroslav@ivinco.com 10418Syaroslav@ivinco.com if (empty($cacheDoc[$id])){ 10517Syaroslav@ivinco.com // Create the parser 10617Syaroslav@ivinco.com $Parser = & new Doku_Parser(); 1077Syaroslav@ivinco.com 10817Syaroslav@ivinco.com // Add the Handler 10917Syaroslav@ivinco.com $Parser->Handler = & new Doku_Handler(); 11017Syaroslav@ivinco.com 11117Syaroslav@ivinco.com // Load the header mode to find headers 11217Syaroslav@ivinco.com $Parser->addMode('header',new Doku_Parser_Mode_Header()); 11318Syaroslav@ivinco.com $Parser->addMode('listblock',new Doku_Parser_Mode_ListBlock()); 11417Syaroslav@ivinco.com 11517Syaroslav@ivinco.com // Loads the raw wiki document 11617Syaroslav@ivinco.com $doc = io_readFile(wikiFN($id)); 1177Syaroslav@ivinco.com 11817Syaroslav@ivinco.com // Get a list of instructions 11917Syaroslav@ivinco.com $instructions = $Parser->parse($doc); 12017Syaroslav@ivinco.com 12117Syaroslav@ivinco.com unset($Parser->Handler); 12217Syaroslav@ivinco.com unset($Parser); 12317Syaroslav@ivinco.com 12417Syaroslav@ivinco.com //free old cache 12518Syaroslav@ivinco.com $cacheInstructions = null; 12618Syaroslav@ivinco.com $cacheDoc = null; 1277Syaroslav@ivinco.com 12817Syaroslav@ivinco.com //initialize new cache 12918Syaroslav@ivinco.com $cacheInstructions[$id] = $instructions; 13018Syaroslav@ivinco.com $cacheDoc[$id] = $doc; 13117Syaroslav@ivinco.com } else { 13217Syaroslav@ivinco.com $instructions = $cacheInstructions[$id]; 13317Syaroslav@ivinco.com $doc = $cacheDoc[$id]; 13418Syaroslav@ivinco.com } 1357Syaroslav@ivinco.com 13617Syaroslav@ivinco.com 1377Syaroslav@ivinco.com 1387Syaroslav@ivinco.com // Use this to watch when we're inside the section we want 1397Syaroslav@ivinco.com $inSection = FALSE; 1407Syaroslav@ivinco.com $startPos = 0; 1417Syaroslav@ivinco.com $endPos = 0; 1427Syaroslav@ivinco.com 1437Syaroslav@ivinco.com // Loop through the instructions 1447Syaroslav@ivinco.com foreach ( $instructions as $instruction ) { 1457Syaroslav@ivinco.com 1467Syaroslav@ivinco.com if ( !$inSection ) { 1477Syaroslav@ivinco.com 1487Syaroslav@ivinco.com // Look for the header for the "Lists" heading 1497Syaroslav@ivinco.com if ( $instruction[0] == 'header' && 1507Syaroslav@ivinco.com trim($instruction[1][0]) == $header ) { 1517Syaroslav@ivinco.com 1527Syaroslav@ivinco.com $startPos = $instruction[2]; 1537Syaroslav@ivinco.com $inSection = TRUE; 1547Syaroslav@ivinco.com } 1557Syaroslav@ivinco.com } else { 1567Syaroslav@ivinco.com 1577Syaroslav@ivinco.com // Look for the end of the section 1587Syaroslav@ivinco.com if ( $instruction[0] == 'section_close' ) { 1597Syaroslav@ivinco.com $endPos = $instruction[2]; 1607Syaroslav@ivinco.com break; 1617Syaroslav@ivinco.com } 1627Syaroslav@ivinco.com } 1637Syaroslav@ivinco.com } 1647Syaroslav@ivinco.com 1657Syaroslav@ivinco.com // Normalize and pad the document in the same way the parse does 1667Syaroslav@ivinco.com // so that byte indexes with match 1677Syaroslav@ivinco.com $doc = "\n".str_replace("\r\n","\n",$doc)."\n"; 1687Syaroslav@ivinco.com $section = substr($doc, $startPos, ($endPos-$startPos)); 1697Syaroslav@ivinco.com 1707Syaroslav@ivinco.com return $section; 1717Syaroslav@ivinco.com} 1727Syaroslav@ivinco.com 1737Syaroslav@ivinco.comfunction getCategories($id) 1747Syaroslav@ivinco.com{ 1757Syaroslav@ivinco.com if (empty($id)) return ''; 1767Syaroslav@ivinco.com 1777Syaroslav@ivinco.com if (false === strpos($id, ":")){ 1787Syaroslav@ivinco.com return $id; 1797Syaroslav@ivinco.com } 1807Syaroslav@ivinco.com 1817Syaroslav@ivinco.com $ns = explode(":", $id); 1827Syaroslav@ivinco.com $nsCount = count($ns); 1837Syaroslav@ivinco.com 1847Syaroslav@ivinco.com $result = ''; 1857Syaroslav@ivinco.com do{ 1867Syaroslav@ivinco.com for($i = 0; $i < $nsCount; $i++){ 1877Syaroslav@ivinco.com $name = $ns[$i]; 1887Syaroslav@ivinco.com $result .= $name; 1897Syaroslav@ivinco.com if ($i < $nsCount - 1){ 1907Syaroslav@ivinco.com $result .= ':'; 1917Syaroslav@ivinco.com } 1927Syaroslav@ivinco.com } 1937Syaroslav@ivinco.com $result .= ' '; 1947Syaroslav@ivinco.com }while($nsCount--); 1957Syaroslav@ivinco.com return $result; 1967Syaroslav@ivinco.com} 1977Syaroslav@ivinco.com 1987Syaroslav@ivinco.com 1997Syaroslav@ivinco.com /** 2007Syaroslav@ivinco.com * Method return all wiki page names 2017Syaroslav@ivinco.com * @global array $conf 2027Syaroslav@ivinco.com * @return array 2037Syaroslav@ivinco.com */ 2047Syaroslav@ivinco.com function getPagesList() 2057Syaroslav@ivinco.com { 2067Syaroslav@ivinco.com global $conf; 2077Syaroslav@ivinco.com 2087Syaroslav@ivinco.com $data = array(); 2097Syaroslav@ivinco.com sort($data); 2107Syaroslav@ivinco.com search($data,$conf['datadir'],'search_allpages','',''); 2117Syaroslav@ivinco.com 2127Syaroslav@ivinco.com return $data; 2138Syaroslav@ivinco.com} 2148Syaroslav@ivinco.com 21515Syaroslav@ivinco.comfunction getNsLinks($id, $keywords, $search) 2168Syaroslav@ivinco.com{ 2178Syaroslav@ivinco.com global $conf; 2188Syaroslav@ivinco.com $parts = explode(':', $id); 2198Syaroslav@ivinco.com $count = count($parts); 22015Syaroslav@ivinco.com 2218Syaroslav@ivinco.com // print intermediate namespace links 2228Syaroslav@ivinco.com $part = ''; 22310Syaroslav@ivinco.com $data = array(); 22410Syaroslav@ivinco.com $titles = array(); 2258Syaroslav@ivinco.com for($i=0; $i<$count; $i++){ 2268Syaroslav@ivinco.com $part .= $parts[$i].':'; 2278Syaroslav@ivinco.com $page = $part; 2288Syaroslav@ivinco.com resolve_pageid('',$page,$exists); 22915Syaroslav@ivinco.com 23015Syaroslav@ivinco.com if (preg_match("#:start$#", $page) && !preg_match("#:start:$#", $part)) { 23113Syaroslav@ivinco.com $page = substr($page, 0, strpos($page, ":start")); 23213Syaroslav@ivinco.com }; 2338Syaroslav@ivinco.com 2348Syaroslav@ivinco.com // output 2358Syaroslav@ivinco.com if ($exists){ 23615Syaroslav@ivinco.com $titles[wl($page)] = $parts[$i]; 2378Syaroslav@ivinco.com } else { 23818Syaroslav@ivinco.com $titles[wl($page)] = $parts[$i]; 23915Syaroslav@ivinco.com } 24015Syaroslav@ivinco.com $data[] = array('link' => "?do=sphinxsearch&id={$keywords}".urlencode(" @categories $page")); 2418Syaroslav@ivinco.com } 24215Syaroslav@ivinco.com $titleExcerpt = $search->getExcerpt($titles, $search->starQuery($keywords)); 24310Syaroslav@ivinco.com $i = 0; 24410Syaroslav@ivinco.com foreach ($data as $key => $notused){ 24510Syaroslav@ivinco.com $data[$key]['title'] = $titleExcerpt[$i++]; 24610Syaroslav@ivinco.com } 24710Syaroslav@ivinco.com return $data; 2487Syaroslav@ivinco.com}