*/ class Etym { protected $baseURL; protected $domSearch; protected $pasteCmd; /** * Initalise with config options * * @param string $baseURL * @param string $domSearch * @param string $pasteCmd * @author Phil Burton */ public function __construct(string $baseURL, string $domSearch, string $pasteCmd) { $this->baseURL = $baseURL; $this->domSearch = $domSearch; $this->pasteCmd = $pasteCmd; } /** * Search for and return etym defeiniton * * @return string * @author Phil Burton */ public function getDefinition(): string { $input = $this->readStdin(); $targetURL = $this->baseURL . $input; $dom = new Dom; $dom->loadFromUrl($targetURL, [], new Curl); $html = $dom->find($this->domSearch); if (!$html instanceof \PHPHtmlParser\Dom\Collection || count($html) <= 0) { echo "No entry found for '$input'!\n"; exit(2); } $definition = $this->cleanUpHtml($html[0]->innerHtml()); $definition = $this->handleTruncation($input, $definition, $targetURL); // echo $definition . "\n"; return $definition; } /** * Get and return the user input * * @return string * @author Phil Burton */ protected function readStdin(): string { $input = fgets(STDIN); if ($input === false) { echo "No input supplied!\n"; exit(1); } $input = rtrim($input, "\n"); return $input; } /** * Tidy and return the hmtl * * @param string $input * @return string * @author Phil Burton */ protected function cleanUpHtml(string $input): string { // Strip HTML Tags $clear = strip_tags($input); // Clean up things like & $clear = html_entity_decode($clear); // Strip out any url-encoded stuff $clear = urldecode($clear); // Replace Multiple spaces with single space $clear = preg_replace('/ +/', ' ', $clear); // Trim the string of leading/trailing space $clear = trim($clear); // Capitalise the first char. $clear = ucfirst($clear); return $clear; } /** * Handle when string is too long * * @param string $input * @param string $definition * @param string $url * @return string * @author Phil Burton */ protected function handleTruncation(string $input, string $definition, string $url): string { $truncated = $definition; $MAX_CHARACTERS = 350; if (strlen($truncated) >= $MAX_CHARACTERS) { // Create that povjee link. // Capitalise the first char of the input. $input = ucfirst($input); $defAndUrl = "\"$input\"" . "\n\n" . $definition . "\n\n" . "[Original at: $url]"; $safeDef = escapeshellarg($defAndUrl); $pasteBinCmd = "echo $safeDef | " . $this->pasteCmd; $pasteBinLink = exec($pasteBinCmd); $truncated = substr($truncated, 0, $MAX_CHARACTERS) . "... [More info at $pasteBinLink]"; } return $truncated; } }