getAutocompleterValues() public méthode

获取自动完成
Exemple #1
0
 private function autocomplete($inputStream)
 {
     $autocomplete = $this->question->getAutocompleterValues();
     $ret = '';
     $i = 0;
     $ofs = -1;
     $matches = $autocomplete;
     $numMatches = count($matches);
     $sttyMode = shell_exec('stty -g');
     shell_exec('stty -icanon -echo');
     while (!feof($inputStream)) {
         $c = fread($inputStream, 1);
         if ("" === $c) {
             if (0 === $numMatches && 0 !== $i) {
                 --$i;
                 $this->output->write("");
             }
             if ($i === 0) {
                 $ofs = -1;
                 $matches = $autocomplete;
                 $numMatches = count($matches);
             } else {
                 $numMatches = 0;
             }
             $ret = substr($ret, 0, $i);
         } elseif ("" === $c) {
             $c .= fread($inputStream, 2);
             if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) {
                 if ('A' === $c[2] && -1 === $ofs) {
                     $ofs = 0;
                 }
                 if (0 === $numMatches) {
                     continue;
                 }
                 $ofs += 'A' === $c[2] ? -1 : 1;
                 $ofs = ($numMatches + $ofs) % $numMatches;
             }
         } elseif (ord($c) < 32) {
             if ("\t" === $c || "\n" === $c) {
                 if ($numMatches > 0 && -1 !== $ofs) {
                     $ret = $matches[$ofs];
                     $this->output->write(substr($ret, $i));
                     $i = strlen($ret);
                 }
                 if ("\n" === $c) {
                     $this->output->write($c);
                     break;
                 }
                 $numMatches = 0;
             }
             continue;
         } else {
             $this->output->write($c);
             $ret .= $c;
             ++$i;
             $numMatches = 0;
             $ofs = 0;
             foreach ($autocomplete as $value) {
                 if (0 === strpos($value, $ret) && $i !== strlen($value)) {
                     $matches[$numMatches++] = $value;
                 }
             }
         }
         $this->output->write("");
         if ($numMatches > 0 && -1 !== $ofs) {
             $this->output->write("7");
             $this->output->highlight(substr($matches[$ofs], $i));
             $this->output->write("8");
         }
     }
     shell_exec(sprintf('stty %s', $sttyMode));
     return $ret;
 }