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.
98 lines
2.3 KiB
98 lines
2.3 KiB
<?php
|
|
$wikidataCache = array();
|
|
|
|
function wikidataLoad ($id) {
|
|
global $wikidataCache;
|
|
|
|
if (!array_key_exists($id, $wikidataCache)) {
|
|
$body = file_get_contents("https://www.wikidata.org/wiki/Special:EntityData/{$id}.json");
|
|
$body = $body ? json_decode($body, true) : false;
|
|
|
|
if (!array_key_exists('entities', $body) || !array_key_exists($id, $body['entities'])) {
|
|
return false;
|
|
}
|
|
|
|
$wikidataCache[$id] = $body['entities'][$id];
|
|
}
|
|
|
|
return $wikidataCache[$id];
|
|
}
|
|
|
|
function wikidataGetLabel ($id, $lang) {
|
|
$data = wikidataLoad($id);
|
|
|
|
if (array_key_exists($lang, $data['labels'])) {
|
|
return $data['labels'][$lang]['value'];
|
|
}
|
|
elseif (array_key_exists('en', $data['labels'])) {
|
|
return $data['labels']['en']['value'];
|
|
}
|
|
elseif (!sizeof($data['labels'])) {
|
|
return $id;
|
|
}
|
|
else {
|
|
return array_values($data['labels'])[0]['value'];
|
|
}
|
|
}
|
|
|
|
function wikidataGetValues ($id, $property) {
|
|
$data = wikidataLoad($id);
|
|
|
|
if (!array_key_exists($property, $data['claims'])) {
|
|
return [];
|
|
}
|
|
|
|
return array_map(
|
|
function ($el) {
|
|
return $el['mainsnak']['datavalue']['value'];
|
|
},
|
|
$data['claims'][$property]
|
|
);
|
|
}
|
|
|
|
function wikidataFormatDate($value, $maxPrecision = 13) {
|
|
$v = new DateTime($value['time']);
|
|
$p = min($maxPrecision, $value['precision']);
|
|
|
|
if ($p < 9) {
|
|
} else {
|
|
$formats = [
|
|
9 => 'Y',
|
|
10 => 'M Y',
|
|
11 => 'j. M Y',
|
|
12 => 'j. M Y - G:00',
|
|
13 => 'j. M Y - G:i',
|
|
14 => 'j. M Y - G:i:s',
|
|
];
|
|
|
|
return $v->format($formats[$p]);
|
|
}
|
|
}
|
|
|
|
function wikidataFormat ($id, $lang) {
|
|
$ret = '<b>' . wikidataGetLabel($id, $lang) . '</b>';
|
|
|
|
$birthDate = wikidataGetValues($id, 'P569');
|
|
$deathDate = wikidataGetValues($id, 'P570');
|
|
if (sizeof($birthDate) && sizeof($deathDate)) {
|
|
$ret .= ' (' . wikidataFormatDate($birthDate[0], 11) . ' — ' . wikidataFormatDate($deathDate[0], 11) . ')';
|
|
}
|
|
elseif (sizeof($birthDate)) {
|
|
$ret .= ' (* ' . wikidataFormatDate($birthDate[0], 11) . ')';
|
|
}
|
|
elseif (sizeof($deathDate)) {
|
|
$ret .= ' († ' . wikidataFormatDate($birthDate[0], 11) . ')';
|
|
}
|
|
|
|
$occupation = wikidataGetValues($id, 'P106');
|
|
if (sizeof($occupation)) {
|
|
$ret .= ', ' . implode(', ', array_map(
|
|
function ($value) use ($lang) {
|
|
return wikidataGetLabel($value['id'], $lang);
|
|
},
|
|
$occupation
|
|
));
|
|
}
|
|
|
|
return $ret;
|
|
}
|