%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /www/varak.net/wiki.varak.net/extensions/CirrusSearch/includes/Query/
Upload File :
Create Path :
Current File : /www/varak.net/wiki.varak.net/extensions/CirrusSearch/includes/Query/SimpleKeywordFeature.php

<?php

namespace CirrusSearch\Query;

use CirrusSearch\Searcher;
use CirrusSearch\Search\SearchContext;

/**
 * Implements abstract handling of keyword features that are composed of a
 * keyword followed by a colon then an optionally quoted value. For consistency
 * most query features should be implemented this way using the default
 * getValueRegex() where possible.
 */
abstract class SimpleKeywordFeature implements KeywordFeature {
	/**
	 * @return string A piece of a regular expression (not wrapped in //) that
	 * matches the key to trigger this feature. Does not include the negation
	 * (-) prefix.
	 */
	abstract protected function getKeywordRegex();

	/**
	 * Captures either a quoted or unquoted string. Quoted strings may have
	 * escaped (\") quotes embedded in them.
	 *
	 * @return string A piece of a regular expression (not wrapped in //) that
	 * matches the acceptable values for this feature. Must contain quoted and
	 * unquoted capture groups.
	 */
	protected function getValueRegex() {
		return '"(?<quoted>(?:\\\\"|[^"])*)"|(?<unquoted>[^"\s]+)';
	}

	/**
	 * Applies the detected keyword from the search term. May apply changes
	 * either to $context directly, or return a filter to be added.
	 *
	 * @param SearchContext $context
	 * @param string $key The keyword
	 * @param string $value The value attached to the keyword with quotes stripped and escaped
	 *  quotes un-escaped.
	 * @param string $quotedValue The original value in the search string, including quotes if used
	 * @param bool $negated Is the search negated? Not used to generate the returned AbstractQuery,
	 *  that will be negated as necessary. Used for any other building/context necessary.
	 * @return array Two element array, first an AbstractQuery or null to apply to the
	 *  query. Second a boolean indicating if the quotedValue should be kept in the search
	 *  string.
	 */
	abstract protected function doApply( SearchContext $context, $key, $value, $quotedValue, $negated );

	/**
	 * @param SearchContext $context
	 * @param string $term Search query
	 * @return string Remaining search query
	 */
	public function apply( SearchContext $context, $term ) {
		$keywordRegex = '(?<key>-?' . $this->getKeywordRegex() . ')';
		$valueRegex = '(?<value>' . $this->getValueRegex() . ')';

		return QueryHelper::extractSpecialSyntaxFromTerm(
			$context,
			$term,
			// initial positive lookbehind ensures keyword doesn't
			// match in the middle of a word.
			"/(?<=^|\\s){$keywordRegex}:\\s*{$valueRegex}\\s?/",
			function ( $match ) use ( $context ) {
				$key = $match['key'];
				$quotedValue = $match['value'];
				$value = isset( $match['unquoted'] )
					? $match['unquoted']
					: str_replace( '\"', '"', $match['quoted']);

				if ( $key[0] === '-' ) {
					$negated = true;
					$key = substr( $key, 1 );
				} else {
					$negated = false;
				}

				$context->addSyntaxUsed( $key );
				list( $filter, $keepText ) = $this->doApply(
					$context,
					$key,
					$value,
					$quotedValue,
					$negated
				);
				if ( $filter !== null ) {
					if ( $negated ) {
						$context->addNotFilter( $filter );
					} else {
						$context->addFilter( $filter );
					}
				}

				return $keepText ? "$quotedValue " : '';
			}
		);
	}
}

Zerion Mini Shell 1.0