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 . " &raquo; ".$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}