<?php

class quickstart_index
{
	private $_index;
	private $_dir;

	private $_base;
	private $_source;

	public function __construct($index_file, $base, $source)
	{
		$this->_index = new Zend_Search_Lucene($index_file, true);
		$this->_dir = $index_file;
		$this->_base = $base;
		$this->_source = $source;
	}

	public function create_index()
	{
		echo "Building search index...\n";
		$pages = include($this->_source);
		$count = 0;
		foreach($pages as $chapter => $sections)
		{
			foreach($sections as $section)
			{
				echo "    Adding $section\n";
				$page = $this->_base.'/'.$section;
				$file_content = file_get_contents($page);
				$this->add($file_content,$section, filemtime($page));
				$count++;
			}
		}

		$this->_index->commit();
		echo "\n {$count} files indexed.\n";
	}

	public function add($content, $section, $mtime)
	{
		foreach($this->split_headings($content) as $headers)
		{
			$doc = new Zend_Search_Lucene_Document();
			$link = "index.php?page=".preg_replace('/\/|\\\/', '.', $section);
			$link = str_replace('.page', '', $link).'#'.$headers['section'];

			//unsearchable text
			$doc->addField(Zend_Search_Lucene_Field::UnIndexed('link', $link));
			$doc->addField(Zend_Search_Lucene_Field::UnIndexed('mtime', $mtime));
			$doc->addField(Zend_Search_Lucene_Field::UnIndexed('title', $headers['title']));
			$doc->addField(Zend_Search_Lucene_Field::UnIndexed('text', $headers['content']));

			//searchable text
			$doc->addField(Zend_Search_Lucene_Field::Keyword('page', strtolower($headers['title'])));
			$body = strtolower($this->sanitize($headers['content'])).' '.strtolower($headers['title']);
			$doc->addField(Zend_Search_Lucene_Field::Unstored('contents',$body));
			$this->_index->addDocument($doc);
		}
	}

	function sanitize($input)
	{
		return htmlentities(strip_tags( $input ));
	}

	public function index()
	{
		return $this->_index;
	}

	protected function split_headings($html)
	{
		$html = preg_replace('/<\/?com:TContent[^<]*>/', '', $html);

		$html = preg_replace('/<b>([^<]*)<\/b>/', '$1', $html);
		$html = preg_replace('/<i>([^<]*)<\/i>/', '$1', $html);
		$html = preg_replace('/<tt>([^<]*)<\/tt>/', '$1', $html);

		$html = preg_replace('/<h1([^>]*)>([^<]*)<\/h1>/', '<hh$1>$2</hh>', $html);
		$html = preg_replace('/<h2([^>]*)>([^<]*)<\/h2>/', '<hh$1>$2</hh>', $html);
		$html = preg_replace('/<h3([^>]*)>([^<]*)<\/h3>/', '<hh$1>$2</hh>', $html);


		$sections = preg_split('/<hh[^>]*>([^<]+)<\/hh>/', $html,-1);
		$headers = array();
		preg_match_all('/<hh([^>]*)>([^<]+)<\/hh>/', $html, $headers);
		$contents = array();
		for($i = 1, $t = count($sections); $i < $t; $i++)
		{
			$content['title'] = trim($this->sanitize($headers[2][$i-1]));
			$content['section'] = str_replace('"', '',trim($headers[1][$i-1],'"'));
			$content['content'] = trim($this->sanitize($sections[$i]));
			$contents[] = $content;
		}

		return $contents;
	}

	public function commit()
	{
		$this->_index->commit();
		$count = $this->_index->count();
		echo "\nSaving search index ({$count}) to {$this->_dir}\n\n";
	}
}
?>