diff --git a/src/wikipedia.php b/src/wikipedia.php index 54052567..a36c9920 100644 --- a/src/wikipedia.php +++ b/src/wikipedia.php @@ -4,12 +4,48 @@ function ajax_wikipedia ($param) { $wp_lang = $m[1]; $wp_page = $m[2]; } + elseif (preg_match("/^Q\d+$/", $param['page'])) { + $id = $param['page']; + $body = file_get_contents("https://www.wikidata.org/wiki/Special:EntityData/{$id}.json"); + $body = json_decode($body, true); - if (!isset($wp_lang) || !isset($wp_page)) { + if (!array_key_exists('entities', $body) || !array_key_exists($id, $body['entities'])) { + return false; + } + + $data = $body['entities'][$id]; + + if (array_key_exists('sitelinks', $data)) { + if (array_key_exists($param['lang'] . 'wiki', $data['sitelinks'])) { + $wp_lang = $param['lang']; + $wp_url = $data['sitelinks'][$param['lang'] . 'wiki']['url']; + } + elseif (array_key_exists('enwiki', $data['sitelinks'])) { + $wp_lang = 'en'; + $wp_url = $data['sitelinks']['enwiki']['url']; + } + else { + $sitelinks_ids = array_keys($data['sitelinks']); + $sitelinks_ids = array_values(array_filter($sitelinks_ids, function ($id) { + return preg_match('/wiki$/', $id); + })); + + if (sizeof($sitelinks_ids)) { + $id = $sitelinks_ids[0]; + $wp_lang = substr($id, 0, strlen($id) - 4); + $wp_url = $data['sitelinks'][$id]['url']; + } + } + } + } + + if (!isset($wp_lang) || !(isset($wp_page) || isset($wp_url))) { return false; } - $wp_url = "https://{$wp_lang}.wikipedia.org/wiki/" . urlencode(strtr($wp_page, array(" " => "_"))); + if (!isset($wp_url)) { + $wp_url = "https://{$wp_lang}.wikipedia.org/wiki/" . urlencode(strtr($wp_page, array(" " => "_"))); + } $content = file_get_contents($wp_url);