Simplify NodaWikidataFetcher, unify list of langs, simplify linking to noda sources

Close #2
This commit is contained in:
Joshua Ramon Enslin 2021-03-17 22:06:08 +01:00
parent f0b5a08cdf
commit 1fd87c7e6d
Signed by: jrenslin
GPG Key ID: 46016F84501B70AE

View File

@ -12,22 +12,10 @@ declare(strict_types = 1);
*/ */
class NodaWikidataFetcher { class NodaWikidataFetcher {
const LANGUAGES_MAIN_DESC = ['da', 'de', 'en', 'es', 'fr', 'hu', 'it', 'nl', 'sv', 'ru', 'zh', 'jp', 'pt']; const LANGUAGES_MAIN_DESC = ['de', 'da', 'en', 'es', 'fr', 'hu', 'it', 'jp', 'nl', 'pt', 'ru', 'sv', 'zh'];
const LANGUAGES_TO_CHECK = ['ar', 'bn', 'cs', 'da', 'de', 'el', 'en', 'es', 'fa', 'fi', 'fr', 'ha', 'he', 'hi', 'hu', 'id', 'it', 'ja', 'ka', 'ko', 'nl', 'pl', 'pt', 'ro', 'ru', 'sv', 'sw', 'ta', 'th', 'tl', 'tr', 'ur', 'vi', 'zh']; const LANGUAGES_TO_CHECK = ['ar', 'bn', 'cs', 'da', 'de', 'el', 'en', 'es', 'fa', 'fi', 'fr', 'ha', 'he', 'hi', 'hu', 'id', 'it', 'ja', 'ka', 'ko', 'nl', 'pl', 'pt', 'ro', 'ru', 'sv', 'sw', 'ta', 'th', 'tl', 'tr', 'ur', 'vi', 'zh'];
const URL_PREFIXES_PERSINST_NODA_SOURCE = [ const LANGUAGES_TO_CAPITALIZE = ["cs", "da", "de", "en", "es", "fr", "fi", "id", "it", "nl", "pl", "pt", "ru", "sv", "tl", "tr"];
"gnd_id" => "https://d-nb.info/gnd/",
"viaf_id" => "https://viaf.org/viaf/",
"bnf_id" => "https://catalogue.bnf.fr/ark:/12148/cb",
"ulan_id" => "http://vocab.getty.edu/page/ulan/",
"rkd_id" => "https://rkd.nl/explore/artists/",
"pim_id" => "https://opac-nevter.pim.hu/en/record/-/record/",
"ndl_id" => "https://id.ndl.go.jp/auth/ndlna/",
"npg_id" => "https://www.npg.org.uk/collections/search/person/",
"loc_id" => "http://id.loc.gov/authorities/names/",
"bne_id" => "http://datos.bne.es/persona/",
"nomisma_id" => "http://nomisma.org/id/",
];
const URL_PREFIXES_PLACES_NODA_SOURCE = [ const URL_PREFIXES_PLACES_NODA_SOURCE = [
"gnd" => "https://d-nb.info/gnd/", "gnd" => "https://d-nb.info/gnd/",
@ -35,6 +23,59 @@ class NodaWikidataFetcher {
"osm" => "https://www.openstreetmap.org/relation/", "osm" => "https://www.openstreetmap.org/relation/",
"loc" => "http://id.loc.gov/authorities/names/", "loc" => "http://id.loc.gov/authorities/names/",
"cona" => "http://vocab.getty.edu/page/cona/", "cona" => "http://vocab.getty.edu/page/cona/",
"aat" => "http://vocab.getty.edu/page/aat/",
"iconclass" => "http://iconclass.org/rkd/",
"lcsh" => "http://id.loc.gov/authorities/subjects/",
"wikidata" => "https://www.wikidata.org/wiki/",
"bne" => "http://datos.bne.es/persona/",
"viaf" => "https://viaf.org/viaf/",
"bnf" => "https://catalogue.bnf.fr/ark:/12148/cb",
"ulan" => "http://vocab.getty.edu/page/ulan/",
"rkd" => "https://rkd.nl/explore/artists/",
"pim" => "https://opac-nevter.pim.hu/en/record/-/record/",
"ndl" => "https://id.ndl.go.jp/auth/ndlna/",
"npg" => "https://www.npg.org.uk/collections/search/person/",
];
const P_IDS_NODA_TAGS = [
'gnd' => 'P227',
'lcsh' => 'P244',
'aat' => 'P1014',
'iconclass' => 'P1256',
'rkd' => 'P650',
'osm' => 'P402',
'loc' => 'P244',
'nomisma' => 'P2950',
'cona' => 'P1669',
"rkd" => "P650",
"ulan" => "P245",
"viaf" => "P214",
"bnf" => "P268",
"pim" => "P3973",
"ndl" => "P349", // National Diet Library (Japan)
"npg" => "P1816", // "National" portrait gallery
//"bmpi" => "P6077", // British Museum Person-Institution
"bne" => "P950", // Espana National Library
];
const WIKIPEDIA_REMOVE_LITERALS = [
"<p>Si vous disposez d'ouvrages ou d'articles de référence ou si vous ",
'<p><b>En pratique&#160;:</b> <a href="/wiki/Wikip%C3%A9dia:Citez_vos_sources#Qualité_des_sources" title="Wikipédia:Citez vos sources">Quelles sources sont attendu',
'<pVous pouvez partager vos connaissances en laméliorant (',
'<p class="mw-empty-elt">',
'<p><small>Géolocalisation sur la carte',
'<p><b>Koordinaatit:</b>',
'<p><span class="executeJS" data-gadgetname="ImgToggle"></span',
'<p><span class="imgtoggleboxTitle">',
//'<div class="mw-parser-output"><p>',
'<p><span style="font-size: small;"><span id="coordinates">',
'<p><span></span></p>',
'<p><a rel="nofollow" class="external text" href="https://maps.gs',
'<p><span class="plainlinks nourlexpansion"><a class="external text" href="//tools.wmflabs.org/geohack/geohack.php?langu',
'<p><span style="display:none">',
'<p>&#32;</p>',
'<p><span class="geo noexcerpt"',
]; ];
/** @var MDMysqli */ /** @var MDMysqli */
@ -155,26 +196,7 @@ class NodaWikidataFetcher {
$input = str_replace(PHP_EOL, '', $input); $input = str_replace(PHP_EOL, '', $input);
$stableToRemoveWHTML = [ foreach (self::WIKIPEDIA_REMOVE_LITERALS as $tToRemove) $input = str_replace($tToRemove, "", $input);
"<p>Si vous disposez d'ouvrages ou d'articles de référence ou si vous ",
'<p><b>En pratique&#160;:</b> <a href="/wiki/Wikip%C3%A9dia:Citez_vos_sources#Qualité_des_sources" title="Wikipédia:Citez vos sources">Quelles sources sont attendu',
'<pVous pouvez partager vos connaissances en laméliorant (',
'<p class="mw-empty-elt">',
'<p><small>Géolocalisation sur la carte',
'<p><b>Koordinaatit:</b>',
'<p><span class="executeJS" data-gadgetname="ImgToggle"></span',
'<p><span class="imgtoggleboxTitle">',
//'<div class="mw-parser-output"><p>',
'<p><span style="font-size: small;"><span id="coordinates">',
'<p><span></span></p>',
'<p><a rel="nofollow" class="external text" href="https://maps.gs',
'<p><span class="plainlinks nourlexpansion"><a class="external text" href="//tools.wmflabs.org/geohack/geohack.php?langu',
'<p><span style="display:none">',
'<p>&#32;</p>',
'<p><span class="geo noexcerpt"',
];
foreach ($stableToRemoveWHTML as $tToRemove) $input = str_replace($tToRemove, "", $input);
$first_mention_of_paragraph = strpos($input, '<p>'); $first_mention_of_paragraph = strpos($input, '<p>');
if ($first_mention_of_paragraph !== false) $input = substr($input, $first_mention_of_paragraph, (strrpos($input, '</p>') ?: strlen($input)) - $first_mention_of_paragraph); if ($first_mention_of_paragraph !== false) $input = substr($input, $first_mention_of_paragraph, (strrpos($input, '</p>') ?: strlen($input)) - $first_mention_of_paragraph);
@ -271,12 +293,6 @@ class NodaWikidataFetcher {
$input = str_replace("'", "´", MD_STD::preg_replace_str("/\&\#91\;[0-9]\&\#93\;/", '', $input)); $input = str_replace("'", "´", MD_STD::preg_replace_str("/\&\#91\;[0-9]\&\#93\;/", '', $input));
/*
if (strpos($input, "&#160;") !== false) {
echo html_entity_decode($input);
die();
}
*/
$input = html_entity_decode($input); $input = html_entity_decode($input);
return $input; return $input;
@ -484,8 +500,7 @@ class NodaWikidataFetcher {
$wikidata_gender = "other"; $wikidata_gender = "other";
break; break;
default: default:
echo "Unknown gender: Q-ID is " . $wikidata_gender_id; throw new Exception("Unknown gender: Q-ID is " . $wikidata_gender_id);
exit;
} }
} }
@ -522,50 +537,13 @@ class NodaWikidataFetcher {
} }
$data = $data['entities'][$wikidata_id]; $data = $data['entities'][$wikidata_id];
// Get links to other norm data sources
$normDataSources = [
"gnd_id" => "P227",
"rkd_id" => "P650",
"ulan_id" => "P245",
"viaf_id" => "P214",
"nomisma_id" => "P2950",
"bnf_id" => "P268",
"pim_id" => "P3973",
"ndl_id" => "P349", // National Diet Library (Japan)
"npg_id" => "P1816", // "National" portrait gallery
//"bmpi_id" => "P6077", // British Museum Person-Institution
"loc_id" => "P244", // National library of Brazil
"bne_id" => "P950", // Espana National Library
];
foreach ($normDataSources as $sourceName => $sourceIDWikidata) {
if (isset($data['claims'][$sourceIDWikidata])) $$sourceName = $data['claims'][$sourceIDWikidata][0]['mainsnak']['datavalue']['value'];
}
// Get links to wikipedia // Get links to wikipedia
$wikilink = $wikilinkterm = []; $wikilink = $wikilinkterm = [];
if (isset($data['sitelinks']['dawiki']['url'])) $wikilink['da'] = $data['sitelinks']['dawiki']['url'];
if (isset($data['sitelinks']['dawiki']['title'])) $wikilinkterm['da'] = str_replace(' ', '_', $data['sitelinks']['dawiki']['title']); foreach (self::LANGUAGES_MAIN_DESC as $tLang) {
if (isset($data['sitelinks']['dewiki']['url'])) $wikilink['de'] = $data['sitelinks']['dewiki']['url']; if (isset($data['sitelinks'][$tLang . 'wiki']['url'])) $wikilink[$tLang] = $data['sitelinks'][$tLang . 'wiki']['url'];
if (isset($data['sitelinks']['dewiki']['title'])) $wikilinkterm['de'] = str_replace(' ', '_', $data['sitelinks']['dewiki']['title']); if (isset($data['sitelinks'][$tLang . 'wiki']['title'])) $wikilinkterm[$tLang] = str_replace(' ', '_', $data['sitelinks'][$tLang . 'wiki']['title']);
if (isset($data['sitelinks']['enwiki']['url'])) $wikilink['en'] = $data['sitelinks']['enwiki']['url']; }
if (isset($data['sitelinks']['enwiki']['title'])) $wikilinkterm['en'] = str_replace(' ', '_', $data['sitelinks']['enwiki']['title']);
if (isset($data['sitelinks']['eswiki']['url'])) $wikilink['es'] = $data['sitelinks']['eswiki']['url'];
if (isset($data['sitelinks']['eswiki']['title'])) $wikilinkterm['es'] = str_replace(' ', '_', $data['sitelinks']['eswiki']['title']);
if (isset($data['sitelinks']['frwiki']['url'])) $wikilink['fr'] = $data['sitelinks']['frwiki']['url'];
if (isset($data['sitelinks']['frwiki']['title'])) $wikilinkterm['fr'] = str_replace(' ', '_', $data['sitelinks']['frwiki']['title']);
if (isset($data['sitelinks']['huwiki']['url'])) $wikilink['hu'] = $data['sitelinks']['huwiki']['url'];
if (isset($data['sitelinks']['huwiki']['title'])) $wikilinkterm['hu'] = str_replace(' ', '_', $data['sitelinks']['huwiki']['title']);
if (isset($data['sitelinks']['itwiki']['url'])) $wikilink['it'] = $data['sitelinks']['itwiki']['url'];
if (isset($data['sitelinks']['itwiki']['title'])) $wikilinkterm['it'] = str_replace(' ', '_', $data['sitelinks']['itwiki']['title']);
if (isset($data['sitelinks']['nlwiki']['url'])) $wikilink['nl'] = $data['sitelinks']['nlwiki']['url'];
if (isset($data['sitelinks']['nlwiki']['title'])) $wikilinkterm['nl'] = str_replace(' ', '_', $data['sitelinks']['nlwiki']['title']);
if (isset($data['sitelinks']['ruwiki']['url'])) $wikilink['ru'] = $data['sitelinks']['ruwiki']['url'];
if (isset($data['sitelinks']['ruwiki']['title'])) $wikilinkterm['ru'] = str_replace(' ', '_', $data['sitelinks']['ruwiki']['title']);
if (isset($data['sitelinks']['svwiki']['url'])) $wikilink['sv'] = $data['sitelinks']['svwiki']['url'];
if (isset($data['sitelinks']['svwiki']['title'])) $wikilinkterm['sv'] = str_replace(' ', '_', $data['sitelinks']['svwiki']['title']);
if (isset($data['sitelinks']['zhwiki']['url'])) $wikilink['zh'] = $data['sitelinks']['zhwiki']['url'];
if (isset($data['sitelinks']['zhwiki']['title'])) $wikilinkterm['zh'] = str_replace(' ', '_', $data['sitelinks']['zhwiki']['title']);
$alreadyEntered = false; $alreadyEntered = false;
@ -598,9 +576,19 @@ class NodaWikidataFetcher {
$this->enterPersinstBirthDeathDatesFromWikidata($data, $persinst_id); $this->enterPersinstBirthDeathDatesFromWikidata($data, $persinst_id);
// Get links to other norm data sources
$nodaLinks = [
"wikidata" => $wikidata_id,
];
foreach (self::P_IDS_NODA_TAGS as $vocabName => $pId) {
if ($vocabName === 'lcsh') continue;
if (isset($data['claims'][$pId])) $nodaLinks[$vocabName] = $data['claims'][$pId][0]['mainsnak']['datavalue']['value'];
}
// GET links to other noda entries. // GET links to other noda entries.
$insertNodaRelationsStmt = $this->_mysqli_noda->do_prepare("INSERT INTO `noda` $insertNodaLinkStmt = $this->_mysqli_noda->do_prepare("INSERT INTO `noda`
(`persinst_id`, `noda_source`, `noda_nrinsource`, `noda_link`, `noda_erfasst_von`) (`persinst_id`, `noda_source`, `noda_nrinsource`, `noda_link`, `noda_erfasst_von`)
VALUES VALUES
(?, ?, ?, ?, ?) (?, ?, ?, ?, ?)
@ -610,30 +598,21 @@ class NodaWikidataFetcher {
$this->_mysqli_noda->autocommit(false); $this->_mysqli_noda->autocommit(false);
foreach (self::URL_PREFIXES_PERSINST_NODA_SOURCE as $idVar => $urlStart) { foreach ($nodaLinks as $noda_source => $nodaId) {
if (empty($$idVar)) continue; if (!isset(self::URL_PREFIXES_PLACES_NODA_SOURCE[$noda_source])) {
throw new Exception("Unknown noda link: " . $noda_source);
$tNoda_id = $$idVar; }
$nameInDB = str_replace("_id", "", $idVar); $noda_link_url = self::URL_PREFIXES_PLACES_NODA_SOURCE[$noda_source] . $nodaId;
$tNodaurl = $urlStart . $tNoda_id;
$insertNodaRelationsStmt->bind_param("isssssss", $persinst_id, $nameInDB, $tNoda_id, $tNodaurl, $erfasst_von, $tNoda_id, $tNodaurl, $erfasst_von);
$insertNodaRelationsStmt->execute();
$insertNodaLinkStmt->bind_param("isssssss", $persinst_id, $noda_source, $nodaId, $noda_link_url, $erfasst_von, $nodaId, $noda_link_url, $noda_link_url);
$insertNodaLinkStmt->execute();
} }
$nameInDB = 'wikidata';
$wikidataurl = "https://www.wikidata.org/wiki/" . $wikidata_id;
$insertNodaRelationsStmt->bind_param("isssssss", $persinst_id, $nameInDB, $wikidata_id, $wikidataurl, $erfasst_von, $wikidata_id, $wikidataurl, $erfasst_von);
$insertNodaRelationsStmt->execute();
$this->_mysqli_noda->commit(); $this->_mysqli_noda->commit();
$this->_mysqli_noda->autocommit(true); $this->_mysqli_noda->autocommit(true);
$insertNodaRelationsStmt->close(); $insertNodaLinkStmt->close();
$this->getWikidataTranslationsForPersinst($data, $persinst_id); $this->getWikidataTranslationsForPersinst($data, $persinst_id);
@ -894,13 +873,15 @@ class NodaWikidataFetcher {
unset($currentPlaceResult); unset($currentPlaceResult);
if (isset($data['claims']['P1566'])) $geonames_id = $data['claims']['P1566'][0]['mainsnak']['datavalue']['value']; if (isset($data['claims']['P1566'])) $geonames_id = $data['claims']['P1566'][0]['mainsnak']['datavalue']['value'];
if (isset($data['claims']['P227'])) $gnd_id = $data['claims']['P227'][0]['mainsnak']['datavalue']['value'];
if (isset($data['claims']['P650'])) $rkd_id = $data['claims']['P650'][0]['mainsnak']['datavalue']['value'];
if (isset($data['claims']['P1667'])) $tgn_id = $data['claims']['P1667'][0]['mainsnak']['datavalue']['value']; if (isset($data['claims']['P1667'])) $tgn_id = $data['claims']['P1667'][0]['mainsnak']['datavalue']['value'];
if (isset($data['claims']['P402'])) $osm_id = $data['claims']['P402'][0]['mainsnak']['datavalue']['value'];
if (isset($data['claims']['P244'])) $loc_id = $data['claims']['P244'][0]['mainsnak']['datavalue']['value']; $nodaLinks = [
if (isset($data['claims']['P2950'])) $nomisma_id = $data['claims']['P2950'][0]['mainsnak']['datavalue']['value']; "wikidata" => $wikidata_id,
if (isset($data['claims']['P1669'])) $cona_id = $data['claims']['P1669'][0]['mainsnak']['datavalue']['value']; ];
foreach (self::P_IDS_NODA_TAGS as $vocabName => $pId) {
if ($vocabName === 'lcsh') continue;
if (isset($data['claims'][$pId])) $nodaLinks[$vocabName] = $data['claims'][$pId][0]['mainsnak']['datavalue']['value'];
}
if (isset($data['claims']['P625'])) { if (isset($data['claims']['P625'])) {
$latitude_wd = $data['claims']['P625'][0]['mainsnak']['datavalue']['value']['latitude']; $latitude_wd = $data['claims']['P625'][0]['mainsnak']['datavalue']['value']['latitude'];
@ -916,38 +897,20 @@ class NodaWikidataFetcher {
ON DUPLICATE KEY UPDATE `noda_nrinsource` = ?, ON DUPLICATE KEY UPDATE `noda_nrinsource` = ?,
`noda_link` = ?"); `noda_link` = ?");
foreach (self::URL_PREFIXES_PLACES_NODA_SOURCE as $noda_source => $noda_url_base) { foreach ($nodaLinks as $noda_source => $nodaId) {
if (!empty(${"{$noda_source}_id"})) {
$noda_link_url = $noda_url_base . ${"{$noda_source}_id"};
$insertNodaLinkStmt->bind_param("issssss", $onum, $noda_source, ${"{$noda_source}_id"}, $noda_link_url, $erfasst_von, ${"{$noda_source}_id"}, $noda_link_url);
$insertNodaLinkStmt->execute();
if (!isset(self::URL_PREFIXES_PLACES_NODA_SOURCE[$noda_source])) {
throw new Exception("Unknown noda link: " . $noda_source);
} }
$noda_link_url = self::URL_PREFIXES_PLACES_NODA_SOURCE[$noda_source] . $nodaId;
$insertNodaLinkStmt->bind_param("issssss", $onum, $noda_source, $nodaId, $noda_link_url, $erfasst_von, $nodaId, $noda_link_url);
$insertNodaLinkStmt->execute();
} }
$insertNodaLinkStmt->close(); $insertNodaLinkStmt->close();
unset($insertNodaLinkStmt); unset($insertNodaLinkStmt);
if (!empty($wikidata_id)) {
$wikidataurl = "https://www.wikidata.org/wiki/" . $wikidata_id;
$insertStmt = $this->_mysqli_noda->do_prepare("INSERT INTO `noda_orte`
(`ort_id`, `noda_source`, `noda_nrinsource`, `noda_link`, `noda_erfasst_von`)
VALUES
(?, 'wikidata', ?, ?, ?)
ON DUPLICATE KEY UPDATE `noda_nrinsource` = ?,
`noda_link` = ?");
$insertStmt->bind_param("isssss", $onum, $wikidata_id, $wikidataurl, $erfasst_von, $wikidata_id, $wikidataurl);
$insertStmt->execute();
$insertStmt->close();
unset($insertStmt);
}
if (!empty($tgn_id)) { if (!empty($tgn_id)) {
$updateStmt = $this->_mysqli_noda->do_prepare("UPDATE `orte` $updateStmt = $this->_mysqli_noda->do_prepare("UPDATE `orte`
@ -1001,8 +964,6 @@ class NodaWikidataFetcher {
$checkagainstLanguage = self::LANGUAGES_TO_CHECK; $checkagainstLanguage = self::LANGUAGES_TO_CHECK;
$insertStmt = $this->_mysqli_noda->do_prepare("CALL `nodaInsertOrtTranslation`(?, ?, ?, ?, ?)");
list($languagesToFetch, $wikilinks) = self::getWikidataWikipediaTranslationSources($checkagainstLanguage, $data); list($languagesToFetch, $wikilinks) = self::getWikidataWikipediaTranslationSources($checkagainstLanguage, $data);
try { try {
@ -1012,6 +973,8 @@ class NodaWikidataFetcher {
throw new MDExpectedException("Failed to initialize a request. Try pressing F5 to run the requests again."); throw new MDExpectedException("Failed to initialize a request. Try pressing F5 to run the requests again.");
} }
$insertStmt = $this->_mysqli_noda->do_prepare("CALL `nodaInsertOrtTranslation`(?, ?, ?, ?, ?)");
$this->_mysqli_noda->autocommit(false); $this->_mysqli_noda->autocommit(false);
foreach ($checkagainstLanguage as $lang) { foreach ($checkagainstLanguage as $lang) {
@ -1196,6 +1159,48 @@ class NodaWikidataFetcher {
} }
/**
* Writes relations to norm data sources to DB.
*
* @param array<array<string>> $nodaLinks Links to other noda sources.
* @param integer $tag_id Tag ID.
* @param string $erfasst_von Name of the user to edit this.
*
* @return void
*/
public function writeNodaLinksTag(array $nodaLinks, int $tag_id, string $erfasst_von):void {
$this->_mysqli_noda->autocommit(false);
$insertNodaTagStmt = $this->_mysqli_noda->do_prepare("INSERT INTO `noda_tag`
(`tag_id`, `noda_source`, `noda_nrinsource`, `noda_link`, `noda_erfasst_von`)
VALUES
(?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
`noda_nrinsource` = ?,
`noda_link` = ?,
`noda_erfasst_von` = ?");
foreach ($nodaLinks as $vocabName => $nodaId) {
if (empty(self::URL_PREFIXES_PLACES_NODA_SOURCE[$vocabName])) {
throw new Exception("Unknown URL prefix for: " . $vocabName);
}
$noda_link = self::URL_PREFIXES_PLACES_NODA_SOURCE[$vocabName] . $nodaId;
$insertNodaTagStmt->bind_param("isssssss", $tag_id, $vocabName, $nodaId, $noda_link, $erfasst_von, $nodaId, $noda_link, $erfasst_von);
$insertNodaTagStmt->execute();
}
$insertNodaTagStmt->close();
$insertNodaTagStmt = null;
$this->_mysqli_noda->commit();
$this->_mysqli_noda->autocommit(true);
}
/** /**
* Function for retrieving information. * Function for retrieving information.
* *
@ -1216,28 +1221,11 @@ class NodaWikidataFetcher {
$data = $data['entities'][$wikidata_id]; $data = $data['entities'][$wikidata_id];
$wikilink = $wikilinkterm = []; $wikilink = $wikilinkterm = [];
if (isset($data['sitelinks']['dawiki']['url'])) $wikilink['da'] = $data['sitelinks']['dawiki']['url'];
if (isset($data['sitelinks']['dawiki']['title'])) $wikilinkterm['da'] = str_replace(' ', '_', $data['sitelinks']['dawiki']['title']); foreach (self::LANGUAGES_MAIN_DESC as $tLang) {
if (isset($data['sitelinks']['dewiki']['url'])) $wikilink['de'] = $data['sitelinks']['dewiki']['url']; if (isset($data['sitelinks'][$tLang . 'wiki']['url'])) $wikilink[$tLang] = $data['sitelinks'][$tLang . 'wiki']['url'];
if (isset($data['sitelinks']['dewiki']['title'])) $wikilinkterm['de'] = str_replace(' ', '_', $data['sitelinks']['dewiki']['title']); if (isset($data['sitelinks'][$tLang . 'wiki']['title'])) $wikilinkterm[$tLang] = str_replace(' ', '_', $data['sitelinks'][$tLang . 'wiki']['title']);
if (isset($data['sitelinks']['enwiki']['url'])) $wikilink['en'] = $data['sitelinks']['enwiki']['url']; }
if (isset($data['sitelinks']['enwiki']['title'])) $wikilinkterm['en'] = str_replace(' ', '_', $data['sitelinks']['enwiki']['title']);
if (isset($data['sitelinks']['eswiki']['url'])) $wikilink['es'] = $data['sitelinks']['eswiki']['url'];
if (isset($data['sitelinks']['eswiki']['title'])) $wikilinkterm['es'] = str_replace(' ', '_', $data['sitelinks']['eswiki']['title']);
if (isset($data['sitelinks']['frwiki']['url'])) $wikilink['fr'] = $data['sitelinks']['frwiki']['url'];
if (isset($data['sitelinks']['frwiki']['title'])) $wikilinkterm['fr'] = str_replace(' ', '_', $data['sitelinks']['frwiki']['title']);
if (isset($data['sitelinks']['huwiki']['url'])) $wikilink['hu'] = $data['sitelinks']['huwiki']['url'];
if (isset($data['sitelinks']['huwiki']['title'])) $wikilinkterm['hu'] = str_replace(' ', '_', $data['sitelinks']['huwiki']['title']);
if (isset($data['sitelinks']['itwiki']['url'])) $wikilink['it'] = $data['sitelinks']['itwiki']['url'];
if (isset($data['sitelinks']['itwiki']['title'])) $wikilinkterm['it'] = str_replace(' ', '_', $data['sitelinks']['itwiki']['title']);
if (isset($data['sitelinks']['nlwiki']['url'])) $wikilink['nl'] = $data['sitelinks']['nlwiki']['url'];
if (isset($data['sitelinks']['nlwiki']['title'])) $wikilinkterm['nl'] = str_replace(' ', '_', $data['sitelinks']['nlwiki']['title']);
if (isset($data['sitelinks']['ruwiki']['url'])) $wikilink['ru'] = $data['sitelinks']['ruwiki']['url'];
if (isset($data['sitelinks']['ruwiki']['title'])) $wikilinkterm['ru'] = str_replace(' ', '_', $data['sitelinks']['ruwiki']['title']);
if (isset($data['sitelinks']['svwiki']['url'])) $wikilink['sv'] = $data['sitelinks']['svwiki']['url'];
if (isset($data['sitelinks']['svwiki']['title'])) $wikilinkterm['sv'] = str_replace(' ', '_', $data['sitelinks']['svwiki']['title']);
if (isset($data['sitelinks']['zhwiki']['url'])) $wikilink['zh'] = $data['sitelinks']['zhwiki']['url'];
if (isset($data['sitelinks']['zhwiki']['title'])) $wikilinkterm['zh'] = str_replace(' ', '_', $data['sitelinks']['zhwiki']['title']);
$alreadyEntered = false; $alreadyEntered = false;
@ -1268,57 +1256,17 @@ class NodaWikidataFetcher {
} }
if (isset($data['claims']['P227'])) $gnd_id = $data['claims']['P227'][0]['mainsnak']['datavalue']['value']; $nodaLinks = [
if (isset($data['claims']['P244'])) $lcsh_id = $data['claims']['P244'][0]['mainsnak']['datavalue']['value']; "wikidata" => $wikidata_id,
if (isset($data['claims']['P1014'])) $aat_id = $data['claims']['P1014'][0]['mainsnak']['datavalue']['value']; ];
if (isset($data['claims']['P1256'])) $iconclass_id = $data['claims']['P1256'][0]['mainsnak']['datavalue']['value']; foreach (self::P_IDS_NODA_TAGS as $vocabName => $pId) {
if ($vocabName === 'loc') continue;
$insertNodaTagLink = function(MDMysqliStmt $insertNodaTagStmt, if (isset($data['claims'][$pId])) $nodaLinks[$vocabName] = $data['claims'][$pId][0]['mainsnak']['datavalue']['value'];
string $noda_nrinsource, string $noda_source, string $noda_link, string $erfasst_von, int $tag_id) :void {
$insertNodaTagStmt->bind_param("isssssss", $tag_id, $noda_source, $noda_nrinsource, $noda_link, $erfasst_von, $noda_nrinsource, $noda_link, $erfasst_von);
$insertNodaTagStmt->execute();
};
$this->_mysqli_noda->autocommit(false);
$insertNodaTagStmt = $this->_mysqli_noda->do_prepare("INSERT INTO `noda_tag`
(`tag_id`, `noda_source`, `noda_nrinsource`, `noda_link`, `noda_erfasst_von`)
VALUES
(?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
`noda_nrinsource` = ?,
`noda_link` = ?,
`noda_erfasst_von` = ?");
if (!empty($gnd_id)) {
$insertNodaTagLink($insertNodaTagStmt,
$gnd_id, 'gnd', "https://d-nb.info/gnd/" . $gnd_id, $erfasst_von, $tag_id);
} }
if (!empty($aat_id)) { $this->writeNodaLinksTag($nodaLinks, $tag_id, $erfasst_von);
$insertNodaTagLink($insertNodaTagStmt,
$aat_id, 'aat', "http://vocab.getty.edu/page/aat/" . $aat_id, $erfasst_von, $tag_id);
}
if (!empty($iconclass_id)) {
$insertNodaTagLink($insertNodaTagStmt,
$iconclass_id, 'iconclass', "http://iconclass.org/rkd/{$iconclass_id}/", $erfasst_von, $tag_id);
}
if (!empty($lcsh_id)) {
$insertNodaTagLink($insertNodaTagStmt,
$lcsh_id, 'lcsh', "http://id.loc.gov/authorities/subjects/" . $lcsh_id, $erfasst_von, $tag_id);
}
$insertNodaTagLink($insertNodaTagStmt,
$wikidata_id, 'wikidata', "https://www.wikidata.org/wiki/" . $wikidata_id, $erfasst_von, $tag_id);
$insertNodaTagStmt->close();
$this->_mysqli_noda->commit();
$this->_mysqli_noda->autocommit(true);
// Get translations
if (!empty($data)) $this->getWikidataTranslationsForTag($data, $tag_id); if (!empty($data)) $this->getWikidataTranslationsForTag($data, $tag_id);
} }
@ -1337,8 +1285,6 @@ class NodaWikidataFetcher {
$insertStmt = $this->_mysqli_noda->do_prepare("CALL nodaInsertTagTranslation(?, ?, ?, ?, ?)"); $insertStmt = $this->_mysqli_noda->do_prepare("CALL nodaInsertTagTranslation(?, ?, ?, ?, ?)");
$toCapitalize = ["cs", "da", "de", "en", "es", "fr", "fi", "id", "it", "nl", "pl", "pt", "ru", "sv", "tl", "tr"];
list($languagesToFetch, $wikilinks) = self::getWikidataWikipediaTranslationSources($checkagainstLanguage, $data); list($languagesToFetch, $wikilinks) = self::getWikidataWikipediaTranslationSources($checkagainstLanguage, $data);
try { try {
@ -1387,7 +1333,7 @@ class NodaWikidataFetcher {
$tLang = self::_cleanWikidataInput((string)$data['labels'][$lang]['language']); $tLang = self::_cleanWikidataInput((string)$data['labels'][$lang]['language']);
$tLabel = self::_cleanWikidataInput((string)$data['labels'][$lang]['value']); $tLabel = self::_cleanWikidataInput((string)$data['labels'][$lang]['value']);
if (in_array($tLang, $toCapitalize, true)) { if (in_array($tLang, self::LANGUAGES_TO_CAPITALIZE, true)) {
$tLabel = ucfirst(trim($tLabel)); $tLabel = ucfirst(trim($tLabel));
$tDescription = ucfirst(trim($tDescription)); $tDescription = ucfirst(trim($tDescription));
} }
@ -1404,7 +1350,7 @@ class NodaWikidataFetcher {
$wikilink = ""; $wikilink = "";
if (in_array($lang, $toCapitalize, true)) { if (in_array($lang, self::LANGUAGES_TO_CAPITALIZE, true)) {
$data['labels'][$lang]['value'] = ucfirst(trim($data['labels'][$lang]['value'])); $data['labels'][$lang]['value'] = ucfirst(trim($data['labels'][$lang]['value']));
$data['descriptions'][$lang]['value'] = ucfirst(trim($data['descriptions'][$lang]['value'])); $data['descriptions'][$lang]['value'] = ucfirst(trim($data['descriptions'][$lang]['value']));
} }