You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.5 KiB

  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * @copyright Copyright (c) 2019 Joas Schilling <coding@schilljs.com>
  5. *
  6. * @license GNU AGPL version 3 or any later version
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU Affero General Public License as
  10. * published by the Free Software Foundation, either version 3 of the
  11. * License, or (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU Affero General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Affero General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. *
  21. */
  22. if (PHP_SAPI !== 'cli') {
  23. // Only allow access via the console
  24. exit;
  25. }
  26. if ($argc < 2) {
  27. echo 'Missing search term in call to wikipedia.php';
  28. return 1;
  29. }
  30. $searchTerm = $argv[1];
  31. if ($searchTerm === '--help') {
  32. echo '/wiki - A simple command to find wikipedia articles for a term' . "\n";
  33. echo "\n";
  34. echo 'Example: /wiki Nextcloud' . "\n";
  35. $searchTerm = 'Nextcloud';
  36. }
  37. $endpoint = 'https://en.wikipedia.org/w/api.php';
  38. $parameters = [
  39. 'action' => 'query',
  40. 'generator' => 'prefixsearch',
  41. 'gpssearch' => $searchTerm,
  42. 'prop' => 'description|info',
  43. 'format' => 'json',
  44. 'formatversion' => 2,
  45. 'inprop' => 'url',
  46. ];
  47. $content = file_get_contents($endpoint . '?' . http_build_query($parameters));
  48. $results = json_decode($content, true);
  49. if (empty($results['query']['pages'])) {
  50. echo 'Wikipedia did not have any results for "' . $searchTerm . '" :(' . "\n";
  51. return;
  52. }
  53. $pages = $results['query']['pages'];
  54. $numArticles = count($pages);
  55. $response = 'Wikipedia search results for "' . $searchTerm . '":' . "\n";
  56. $maxArticles = $numArticles > 7 ? 5 : $numArticles;
  57. $length = (int) ((800 - strlen($response)) / $maxArticles);
  58. foreach ($pages as $key => $page) {
  59. if ($key >= $maxArticles) {
  60. break;
  61. }
  62. $link = " - {$page['canonicalurl']}\n";
  63. $remainingLength = max(strlen($page['title']),$length - strlen($link));
  64. if ($remainingLength < strlen("* {$page['title']} - {$page['description']}")) {
  65. $response .= substr("* {$page['title']} - {$page['description']}", 0, $remainingLength) . '…' . $link;
  66. } else {
  67. $response .= "* {$page['title']} - {$page['description']}" . $link;
  68. }
  69. }
  70. if ($maxArticles < $numArticles) {
  71. $response .= '* and ' . ($numArticles - $maxArticles) ." more articles found\n";
  72. }
  73. echo($response);