%PDF- %PDF-
Direktori : /var/www/cwg/wp-content/plugins/searchwp/lib/vendor/wamania/php-stemmer/src/ |
Current File : //var/www/cwg/wp-content/plugins/searchwp/lib/vendor/wamania/php-stemmer/src/Stem.php |
<?php namespace SearchWP\Dependencies\Wamania\Snowball; abstract class Stem implements \SearchWP\Dependencies\Wamania\Snowball\Stemmer { protected static $vowels = array('a', 'e', 'i', 'o', 'u', 'y'); /** * helper, contains stringified list of vowels * @var string */ protected $plainVowels; /** * The word we are stemming * @var string */ protected $word; /** * The original word, use to check if word has been modified * @var string */ protected $originalWord; /** * RV value * @var string */ protected $rv; /** * RV index (based on the beginning of the word) * @var integer */ protected $rvIndex; /** * R1 value * @var integer */ protected $r1; /** * R1 index (based on the beginning of the word) * @var int */ protected $r1Index; /** * R2 value * @var integer */ protected $r2; /** * R2 index (based on the beginning of the word) * @var int */ protected $r2Index; protected function inRv($position) { return $position >= $this->rvIndex; } protected function inR1($position) { return $position >= $this->r1Index; } protected function inR2($position) { return $position >= $this->r2Index; } protected function searchIfInRv($suffixes) { return $this->search($suffixes, $this->rvIndex); } protected function searchIfInR1($suffixes) { return $this->search($suffixes, $this->r1Index); } protected function searchIfInR2($suffixes) { return $this->search($suffixes, $this->r2Index); } protected function search($suffixes, $offset = 0) { $length = \SearchWP\Dependencies\Wamania\Snowball\Utf8::strlen($this->word); if ($offset > $length) { return \false; } foreach ($suffixes as $suffixe) { if (($position = \SearchWP\Dependencies\Wamania\Snowball\Utf8::strrpos($this->word, $suffixe, $offset)) !== \false && \SearchWP\Dependencies\Wamania\Snowball\Utf8::strlen($suffixe) + $position == $length) { return $position; } } return \false; } /** * R1 is the region after the first non-vowel following a vowel, or the end of the word if there is no such non-vowel. */ protected function r1() { list($this->r1Index, $this->r1) = $this->rx($this->word); } /** * R2 is the region after the first non-vowel following a vowel in R1, or the end of the word if there is no such non-vowel. */ protected function r2() { list($index, $value) = $this->rx($this->r1); $this->r2 = $value; $this->r2Index = $this->r1Index + $index; } /** * Common function for R1 and R2 * Search the region after the first non-vowel following a vowel in $word, or the end of the word if there is no such non-vowel. * R1 : $in = $this->word * R2 : $in = R1 */ protected function rx($in) { $length = \SearchWP\Dependencies\Wamania\Snowball\Utf8::strlen($in); // defaults $value = ''; $index = $length; // we search all vowels $vowels = array(); for ($i = 0; $i < $length; $i++) { $letter = \SearchWP\Dependencies\Wamania\Snowball\Utf8::substr($in, $i, 1); if (\in_array($letter, static::$vowels)) { $vowels[] = $i; } } // search the non-vowel following a vowel foreach ($vowels as $position) { $after = $position + 1; $letter = \SearchWP\Dependencies\Wamania\Snowball\Utf8::substr($in, $after, 1); if (!\in_array($letter, static::$vowels)) { $index = $after + 1; $value = \SearchWP\Dependencies\Wamania\Snowball\Utf8::substr($in, $after + 1); break; } } return array($index, $value); } /** * Used by spanish, italian, portuguese, etc (but not by french) * * If the second letter is a consonant, RV is the region after the next following vowel, * or if the first two letters are vowels, RV is the region after the next consonant, * and otherwise (consonant-vowel case) RV is the region after the third letter. * But RV is the end of the word if these positions cannot be found. */ protected function rv() { $length = \SearchWP\Dependencies\Wamania\Snowball\Utf8::strlen($this->word); $this->rv = ''; $this->rvIndex = $length; if ($length < 3) { return \true; } $first = \SearchWP\Dependencies\Wamania\Snowball\Utf8::substr($this->word, 0, 1); $second = \SearchWP\Dependencies\Wamania\Snowball\Utf8::substr($this->word, 1, 1); // If the second letter is a consonant, RV is the region after the next following vowel, if (!\in_array($second, static::$vowels)) { for ($i = 2; $i < $length; $i++) { $letter = \SearchWP\Dependencies\Wamania\Snowball\Utf8::substr($this->word, $i, 1); if (\in_array($letter, static::$vowels)) { $this->rvIndex = $i + 1; $this->rv = \SearchWP\Dependencies\Wamania\Snowball\Utf8::substr($this->word, $i + 1); return \true; } } } // or if the first two letters are vowels, RV is the region after the next consonant, if (\in_array($first, static::$vowels) && \in_array($second, static::$vowels)) { for ($i = 2; $i < $length; $i++) { $letter = \SearchWP\Dependencies\Wamania\Snowball\Utf8::substr($this->word, $i, 1); if (!\in_array($letter, static::$vowels)) { $this->rvIndex = $i + 1; $this->rv = \SearchWP\Dependencies\Wamania\Snowball\Utf8::substr($this->word, $i + 1); return \true; } } } // and otherwise (consonant-vowel case) RV is the region after the third letter. if (!\in_array($first, static::$vowels) && \in_array($second, static::$vowels)) { $this->rv = \SearchWP\Dependencies\Wamania\Snowball\Utf8::substr($this->word, 3); $this->rvIndex = 3; return \true; } } }