diff --git a/src/NodaWikidataFetcher.php b/src/NodaWikidataFetcher.php index bfe950a..b5b8ff2 100644 --- a/src/NodaWikidataFetcher.php +++ b/src/NodaWikidataFetcher.php @@ -1540,42 +1540,93 @@ final class NodaWikidataFetcher { } /** - * Function for generating a wikidata results list. + * Searches Wikidata for a string. * - * @param array> $wikidata_data Wikidata data. - * @param string $link Links. - * @param string $searchTerm Search term. - * @param string $lang Language. + * @param string $searchTerm Search string. + * @param string $lang Searched language. Defaults to German. * - * @return void + * @return array */ - public static function generateWikidataResultsList(array $wikidata_data, string $link, string $searchTerm, string $lang):void { + public static function searchWikidataForString(string $searchTerm, string $lang = "de"):array { - if (count($wikidata_data['search']) === 0) { - echo '

' . ucfirst($searchTerm) . ' not found in Wikidata

'; - return; + $wikidata_data = MD_STD::runCurl("https://www.wikidata.org/w/api.php?action=wbsearchentities&format=json&search=" . urlencode($searchTerm) . "&language=" . urlencode($lang) . "&limit=20", 10000); + if (($wikidata_data = json_decode($wikidata_data, true)) === false) { + return []; } - echo ' -
'; + $output = []; foreach ($wikidata_data['search'] as $result) { - if ((isset($result['description']) and $result['description'] == '') or (isset($result['label']) and $result['label'] == '') or !isset($result['label']) or (isset($result['description']) and $result['description'] == 'Wikipedia disambiguation page') or (isset($result['description']) and $result['description'] == 'Wikimedia disambiguation page')) continue; + if (empty($result['description']) + or empty($result['label']) + or (isset($result['description']) and $result['description'] == 'Wikipedia disambiguation page') + or (isset($result['description']) and $result['description'] == 'Wikimedia disambiguation page') + ) continue; - echo '
-

' . $result['id'] . '

'; - echo '

' . $result['label']; - if (!empty($result['match'])) echo " ({$result['match']['language']}: {$result['match']['text']})"; - echo '

'; - if (!empty($result['description'])) echo '

' . $result['description'] . '

'; - echo '
Wikidata page
'; + $cur = [ + 'id' => $result['id'], + 'label' => $result['label'], + 'label_ext' => '', + 'description' => '', + ]; + + if (!empty($result['match'])) { + $cur['label_ext'] = "{$result['match']['language']}: {$result['match']['text']}"; + } + if (!empty($result['description'])) { + $cur['description'] = $result['description']; + } + + $output[] = $cur; } - echo ' + return $output; + + } + + /** + * Function for generating a wikidata results list. + * + * @param string $link Links. + * @param string $searchTerm Search term. + * @param string $lang Language. + * + * @return string + */ + public static function generateWikidataResultsList(string $link, string $searchTerm, string $lang):string { + + $wikidata_data = self::searchWikidataForString($searchTerm); + $output = ''; + + if (empty($wikidata_data)) { + $output .= '

' . ucfirst($searchTerm) . ' not found in Wikidata

'; + return $output; + } + + $output .= ' +
'; + + foreach ($wikidata_data as $result) { + + if ((isset($result['description']) and $result['description'] == '') or (isset($result['label']) and $result['label'] == '') or !isset($result['label']) or (isset($result['description']) and $result['description'] == 'Wikipedia disambiguation page') or (isset($result['description']) and $result['description'] == 'Wikimedia disambiguation page')) continue; + + $output .= '
+

' . $result['id'] . '

'; + $output .= '

' . $result['label']; + if (!empty($result['label_ext'])) $output .= " ({$result['label_ext']})"; + $output .= '

'; + if (!empty($result['description'])) $output .= '

' . $result['description'] . '

'; + $output .= '
Wikidata page
'; + + } + + $output .= '
'; + return $output; + } /**