diff options
Diffstat (limited to 'phpBB/includes/search/sphinx')
| -rw-r--r-- | phpBB/includes/search/sphinx/config.php | 288 | ||||
| -rw-r--r-- | phpBB/includes/search/sphinx/config_comment.php | 49 | ||||
| -rw-r--r-- | phpBB/includes/search/sphinx/config_section.php | 162 | ||||
| -rw-r--r-- | phpBB/includes/search/sphinx/config_variable.php | 80 | 
4 files changed, 579 insertions, 0 deletions
diff --git a/phpBB/includes/search/sphinx/config.php b/phpBB/includes/search/sphinx/config.php new file mode 100644 index 0000000000..f1864f0c8c --- /dev/null +++ b/phpBB/includes/search/sphinx/config.php @@ -0,0 +1,288 @@ +<?php +/** +* +* @package search +* @copyright (c) 2005 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ +	exit; +} + +/** +* phpbb_search_sphinx_config +* An object representing the sphinx configuration +* Can read it from file and write it back out after modification +* @package search +*/ +class phpbb_search_sphinx_config +{ +	private $sections = array(); + +	/** +	* Constructor which optionally loads data from a variable +	* +	* @param	string	$config_data	Variable containing the sphinx configuration data +	* +	* @access	public +	*/ +	function __construct($config_data) +	{ +		if ($config_data != '') +		{ +			$this->read($config_data); +		} +	} + +	/** +	* Get a section object by its name +	* +	* @param	string 								$name	The name of the section that shall be returned +	* @return	phpbb_search_sphinx_config_section			The section object or null if none was found +	* +	* @access	public +	*/ +	function get_section_by_name($name) +	{ +		for ($i = 0, $size = sizeof($this->sections); $i < $size; $i++) +		{ +			// Make sure this is really a section object and not a comment +			if (($this->sections[$i] instanceof phpbb_search_sphinx_config_section) && $this->sections[$i]->get_name() == $name) +			{ +				return $this->sections[$i]; +			} +		} +	} + +	/** +	* Appends a new empty section to the end of the config +	* +	* @param	string								$name	The name for the new section +	* @return	phpbb_search_sphinx_config_section			The newly created section object +	* +	* @access	public +	*/ +	function add_section($name) +	{ +		$this->sections[] = new phpbb_search_sphinx_config_section($name, ''); +		return $this->sections[sizeof($this->sections) - 1]; +	} + +	/** +	* Reads the config file data +	* +	* @param	string	$config_data	The config file data +	* +	* @access	private +	*/ +	function read($config_data) +	{ +		$this->sections = array(); + +		$section = null; +		$found_opening_bracket = false; +		$in_value = false; + +		foreach ($config_data as $i => $line) +		{ +			// If the value of a variable continues to the next line because the line +			// break was escaped then we don't trim leading space but treat it as a part of the value +			if ($in_value) +			{ +				$line = rtrim($line); +			} +			else +			{ +				$line = trim($line); +			} + +			// If we're not inside a section look for one +			if (!$section) +			{ +				// Add empty lines and comments as comment objects to the section list +				// that way they're not deleted when reassembling the file from the sections +				if (!$line || $line[0] == '#') +				{ +					$this->sections[] = new phpbb_search_sphinx_config_comment($config_file[$i]); +					continue; +				} +				else +				{ +					// Otherwise we scan the line reading the section name until we find +					// an opening curly bracket or a comment +					$section_name = ''; +					$section_name_comment = ''; +					$found_opening_bracket = false; +					for ($j = 0, $length = strlen($line); $j < $length; $j++) +					{ +						if ($line[$j] == '#') +						{ +							$section_name_comment = substr($line, $j); +							break; +						} + +						if ($found_opening_bracket) +						{ +							continue; +						} + +						if ($line[$j] == '{') +						{ +							$found_opening_bracket = true; +							continue; +						} + +						$section_name .= $line[$j]; +					} + +					// And then we create the new section object +					$section_name = trim($section_name); +					$section = new phpbb_search_sphinx_config_section($section_name, $section_name_comment); +				} +			} +			else +			{ +				// If we're looking for variables inside a section +				$skip_first = false; + +				// If we're not in a value continuing over the line feed +				if (!$in_value) +				{ +					// Then add empty lines and comments as comment objects to the variable list +					// of this section so they're not deleted on reassembly +					if (!$line || $line[0] == '#') +					{ +						$section->add_variable(new phpbb_search_sphinx_config_comment($config_file[$i])); +						continue; +					} +	 +					// As long as we haven't yet actually found an opening bracket for this section +					// we treat everything as comments so it's not deleted either +					if (!$found_opening_bracket) +					{ +						if ($line[0] == '{') +						{ +							$skip_first = true; +							$line = substr($line, 1); +							$found_opening_bracket = true; +						} +						else +						{ +							$section->add_variable(new phpbb_search_sphinx_config_comment($config_file[$i])); +							continue; +						} +					} +				} + +				// If we did not find a comment in this line or still add to the previous  +				// line's value ... +				if ($line || $in_value) +				{ +					if (!$in_value) +					{ +						$name = ''; +						$value = ''; +						$comment = ''; +						$found_assignment = false; +					} +					$in_value = false; +					$end_section = false; + +					/* ... then we should prase this line char by char: +					 - first there's the variable name +					 - then an equal sign +					 - the variable value +					 - possibly a backslash before the linefeed in this case we need to continue +					   parsing the value in the next line +					 - a # indicating that the rest of the line is a comment +					 - a closing curly bracket indicating the end of this section*/ +					for ($j = 0, $length = strlen($line); $j < $length; $j++) +					{ +						if ($line[$j] == '#') +						{ +							$comment = substr($line, $j); +							break; +						} +						else if ($line[$j] == '}') +						{ +							$comment = substr($line, $j + 1); +							$end_section = true; +							break; +						} +						else if (!$found_assignment) +						{ +							if ($line[$j] == '=') +							{ +								$found_assignment = true; +							} +							else +							{ +								$name .= $line[$j]; +							} +						} +						else +						{ +							if ($line[$j] == '\\' && $j == $length - 1) +							{ +								$value .= "\n"; +								$in_value = true; +								// Go to the next line and keep processing the value in there +								continue 2; +							} +							$value .= $line[$j]; +						} +					} + +					// If a name and an equal sign were found then we have append a  +					// new variable object to the section +					if ($name && $found_assignment) +					{ +						$section->add_variable(new phpbb_search_sphinx_config_variable(trim($name), trim($value), ($end_section) ? '' : $comment)); +						continue; +					} + +					/* If we found a closing curly bracket this section has been completed +					and we can append it to the section list and continue with looking for  +					the next section */ +					if ($end_section) +					{ +						$section->set_end_comment($comment); +						$this->sections[] = $section; +						$section = null; +						continue; +					} +				} + +				// If we did not find anything meaningful up to here, then just treat it +				// as a comment +				$comment = ($skip_first) ? "\t" . substr(ltrim($config_file[$i]), 1) : $config_file[$i]; +				$section->add_variable(new phpbb_search_sphinx_config_comment($comment)); +			} +		} + +	} + +	/** +	* Returns the config data +	* +	* @return	string	$data	The config data that is generated +	* +	* @access	public +	*/ +	function get_data() +	{ +		$data = ""; +		foreach ($this->sections as $section) +		{ +			$data .= $section->to_string(); +		} + +		return $data; +	} +} diff --git a/phpBB/includes/search/sphinx/config_comment.php b/phpBB/includes/search/sphinx/config_comment.php new file mode 100644 index 0000000000..7f695dbf0c --- /dev/null +++ b/phpBB/includes/search/sphinx/config_comment.php @@ -0,0 +1,49 @@ +<?php +/** +* +* @package search +* @copyright (c) 2005 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ +	exit; +} + +/** +* phpbb_search_sphinx_config_comment +* Represents a comment inside the sphinx configuration +*/ +class phpbb_search_sphinx_config_comment +{ +	private $exact_string; + +	/** +	* Create a new comment +	* +	* @param	string	$exact_string	The content of the comment including newlines, leading whitespace, etc. +	* +	* @access	public +	*/ +	function __construct($exact_string) +	{ +		$this->exact_string = $exact_string; +	} + +	/** +	* Simply returns the comment as it was created +	* +	* @return	string	The exact string that was specified in the constructor +	* +	* @access	public +	*/ +	function to_string() +	{ +		return $this->exact_string; +	} +} diff --git a/phpBB/includes/search/sphinx/config_section.php b/phpBB/includes/search/sphinx/config_section.php new file mode 100644 index 0000000000..79c9c8563d --- /dev/null +++ b/phpBB/includes/search/sphinx/config_section.php @@ -0,0 +1,162 @@ +<?php +/** +* +* @package search +* @copyright (c) 2005 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ +	exit; +} + +/** +* phpbb_search_sphinx_config_section +* Represents a single section inside the sphinx configuration +*/ +class phpbb_search_sphinx_config_section +{ +	private $name; +	private $comment; +	private $end_comment; +	private $variables = array(); + +	/** +	* Construct a new section +	* +	* @param	string	$name		Name of the section +	* @param	string	$comment	Comment that should be appended after the name in the +	*								textual format. +	* +	* @access	public +	*/ +	function __construct($name, $comment) +	{ +		$this->name = $name; +		$this->comment = $comment; +		$this->end_comment = ''; +	} + +	/** +	* Add a variable object to the list of variables in this section +	* +	* @param	phpbb_search_sphinx_config_variable	$variable	The variable object +	* +	* @access	public +	*/ +	function add_variable($variable) +	{ +		$this->variables[] = $variable; +	} + +	/** +	* Adds a comment after the closing bracket in the textual representation +	* +	* @param	string	$end_comment +	* +	* @access	public +	*/ +	function set_end_comment($end_comment) +	{ +		$this->end_comment = $end_comment; +	} + +	/** +	* Getter for the name of this section +	* +	* @return	string	Section's name +	* +	* @access	public +	*/ +	function get_name() +	{ +		return $this->name; +	} + +	/** +	* Get a variable object by its name +	* +	* @param	string 								$name	The name of the variable that shall be returned +	* @return	phpbb_search_sphinx_config_section			The first variable object from this section with the +	*														given name or null if none was found +	* +	* @access	public +	*/ +	function get_variable_by_name($name) +	{ +		for ($i = 0, $size = sizeof($this->variables); $i < $size; $i++) +		{ +			// Make sure this is a variable object and not a comment +			if (($this->variables[$i] instanceof phpbb_search_sphinx_config_variable) && $this->variables[$i]->get_name() == $name) +			{ +				return $this->variables[$i]; +			} +		} +	} + +	/** +	* Deletes all variables with the given name +	* +	* @param	string	$name	The name of the variable objects that are supposed to be removed +	* +	* @access	public +	*/ +	function delete_variables_by_name($name) +	{ +		for ($i = 0, $size = sizeof($this->variables); $i < $size; $i++) +		{ +			// Make sure this is a variable object and not a comment +			if (($this->variables[$i] instanceof phpbb_search_sphinx_config_variable) && $this->variables[$i]->get_name() == $name) +			{ +				array_splice($this->variables, $i, 1); +				$i--; +			} +		} +	} + +	/** +	* Create a new variable object and append it to the variable list of this section +	* +	* @param	string								$name	The name for the new variable +	* @param	string								$value	The value for the new variable +	* @return	phpbb_search_sphinx_config_variable			Variable object that was created +	* +	* @access	public +	*/ +	function create_variable($name, $value) +	{ +		$this->variables[] = new phpbb_search_sphinx_config_variable($name, $value, ''); +		return $this->variables[sizeof($this->variables) - 1]; +	} + +	/** +	* Turns this object into a string which can be written to a config file +	* +	* @return	string	Config data in textual form, parsable for sphinx +	* +	* @access	public +	*/ +	function to_string() +	{ +		$content = $this->name . ' ' . $this->comment . "\n{\n"; + +		// Make sure we don't get too many newlines after the opening bracket +		while (trim($this->variables[0]->to_string()) == '') +		{ +			array_shift($this->variables); +		} + +		foreach ($this->variables as $variable) +		{ +			$content .= $variable->to_string(); +		} +		$content .= '}' . $this->end_comment . "\n"; + +		return $content; +	} +} diff --git a/phpBB/includes/search/sphinx/config_variable.php b/phpBB/includes/search/sphinx/config_variable.php new file mode 100644 index 0000000000..35abe281cb --- /dev/null +++ b/phpBB/includes/search/sphinx/config_variable.php @@ -0,0 +1,80 @@ +<?php +/** +* +* @package search +* @copyright (c) 2005 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ +	exit; +} + +/** +* phpbb_search_sphinx_config_variable +* Represents a single variable inside the sphinx configuration +*/ +class phpbb_search_sphinx_config_variable +{ +	private $name; +	private $value; +	private $comment; + +	/** +	* Constructs a new variable object +	* +	* @param	string	$name		Name of the variable +	* @param	string	$value		Value of the variable +	* @param	string	$comment	Optional comment after the variable in the +	*								config file +	* +	* @access	public +	*/ +	function __construct($name, $value, $comment) +	{ +		$this->name = $name; +		$this->value = $value; +		$this->comment = $comment; +	} + +	/** +	* Getter for the variable's name +	* +	* @return	string	The variable object's name +	* +	* @access	public +	*/ +	function get_name() +	{ +		return $this->name; +	} + +	/** +	* Allows changing the variable's value +	* +	* @param	string	$value	New value for this variable +	* +	* @access	public +	*/ +	function set_value($value) +	{ +		$this->value = $value; +	} + +	/** +	* Turns this object into a string readable by sphinx +	* +	* @return	string	Config data in textual form +	* +	* @access	public +	*/ +	function to_string() +	{ +		return "\t" . $this->name . ' = ' . str_replace("\n", "\\\n", $this->value) . ' ' . $this->comment . "\n"; +	} +}  | 
