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.

82 lines
2.5 KiB

  1. <?php
  2. function ajax_wikipedia ($param) {
  3. if (preg_match("/^([^:]+):(.*)$/", $param['page'], $m)) {
  4. $wp_lang = $m[1];
  5. $wp_page = $m[2];
  6. }
  7. elseif (preg_match("/^Q\d+$/", $param['page'])) {
  8. $data = wikidataLoad($param['page']);
  9. if (array_key_exists('sitelinks', $data)) {
  10. $sitelinks_ids = array_keys($data['sitelinks']);
  11. $sitelinks_ids = array_values(array_filter($sitelinks_ids, function ($id) {
  12. return preg_match('/wiki$/', $id) && $id !== 'commonswiki';
  13. }));
  14. if (array_key_exists($param['lang'] . 'wiki', $data['sitelinks'])) {
  15. $wp_lang = $param['lang'];
  16. $wp_url = $data['sitelinks'][$param['lang'] . 'wiki']['url'];
  17. }
  18. elseif (array_key_exists('enwiki', $data['sitelinks'])) {
  19. $wp_lang = 'en';
  20. $wp_url = $data['sitelinks']['enwiki']['url'];
  21. }
  22. elseif (sizeof($sitelinks_ids)) {
  23. $id = $sitelinks_ids[0];
  24. $wp_lang = substr($id, 0, strlen($id) - 4);
  25. $wp_url = $data['sitelinks'][$id]['url'];
  26. }
  27. else {
  28. $content = "<div><div id='mw-content-text'><div><p>" . wikidataFormat($param['page'], $param['lang']) . "</p></div></div></div>";
  29. $url = "https://wikidata.org/wiki/{$param['page']}";
  30. if (array_key_exists('commonswiki', $data['sitelinks'])) {
  31. $url = $data['sitelinks']['commonswiki']['url'];
  32. }
  33. return array(
  34. 'content' => $content,
  35. 'languages' => [
  36. $param['lang'] => $url,
  37. ],
  38. 'language' => $param['lang'],
  39. );
  40. }
  41. }
  42. }
  43. if (!isset($wp_lang) || !(isset($wp_page) || isset($wp_url))) {
  44. return false;
  45. }
  46. if (!isset($wp_url)) {
  47. $wp_url = "https://{$wp_lang}.wikipedia.org/wiki/" . urlencode(strtr($wp_page, array(" " => "_")));
  48. }
  49. $content = file_get_contents($wp_url);
  50. $langList = array($wp_lang => $wp_url);
  51. $dom = new DOMDocument();
  52. $dom->loadHTML($content);
  53. $langDiv = $dom->getElementsByTagName('li');//interlanguage-link interwiki-bar');
  54. for ($i = 0; $i < $langDiv->length; $i++) {
  55. $li = $langDiv->item($i);
  56. if (preg_match('/^interlanguage-link interwiki-([a-z\-]+)( .*|)$/', $li->getAttribute('class'), $m)) {
  57. $a = $li->firstChild;
  58. $langList[$m[1]] = $a->getAttribute('href');
  59. }
  60. }
  61. if ($wp_lang !== $param['lang'] && array_key_exists($param['lang'], $langList)) {
  62. $content = file_get_contents($langList[$param['lang']]);
  63. $wp_lang = $param['lang'];
  64. }
  65. return array(
  66. 'content' => $content,
  67. 'languages' => $langList,
  68. 'language' => $wp_lang,
  69. );
  70. }