Browse Source

Merge branch '3-wikidata'

master
parent
commit
0b7f297832
  1. 1
      lang/de.json
  2. 1
      lang/en.json
  3. 1
      modulekit.php
  4. 121
      src/image.js
  5. 1
      src/index.js
  6. 37
      src/wikidata.js
  7. 28
      src/wikimedia.php
  8. 108
      src/wikipedia.js
  9. 2
      src/wikipedia.php
  10. 7
      style.css

1
lang/de.json

@ -6,6 +6,7 @@
"!=1": "Fehler"
},
"facilities": "Einrichtungen",
"images": "Bilder",
"main:options": "Optionen",
"more": "mehr",
"open": "geöffnet",

1
lang/en.json

@ -6,6 +6,7 @@
"!=1": "Errors"
},
"facilities": "Facilities",
"images": "Images",
"main:options": "Options",
"more": "more",
"open": "open",

1
modulekit.php

@ -15,6 +15,7 @@ $include = array(
'src/language.php',
'src/ip-location.php',
'src/wikipedia.php',
'src/wikimedia.php',
),
'css' => array(
'style.css',

121
src/image.js

@ -0,0 +1,121 @@
var wikidata = require('./wikidata')
function showImage (url, dom) {
var div = document.createElement('div')
div.innerHTML = '<a target="_blank" href="' + url +'"><img src="' + url + '"></a>'
dom.appendChild(div)
}
function showWikimediaImage (value, dom) {
var url = 'https://commons.wikimedia.org/w/thumb.php?f=' + encodeURIComponent(value) + '&w=' + 235 //imgSize
var div = document.createElement('div')
div.innerHTML = '<a target="_blank" href="https://commons.wikimedia.org/wiki/File:' + encodeURIComponent(value) + '"><img src="' + url + '"/></a>'
dom.appendChild(div)
}
register_hook('show-details', function (data, category, dom, callback) {
var found = 0
var img
var foundImages = []
var div = document.createElement('div')
div.className = 'images loading'
var callbackCount = 1
var l = document.createElement('div')
l.innerHTML = '<i class="fa fa-spinner fa-pulse fa-fw"></i><span class="sr-only">Loading...</span>'
l.className = 'loadingIndicator'
div.appendChild(l)
if (data.object.tags.image) {
img = data.object.tags.image
if (img.indexOf('File:') === 0) {
showWikimediaImage(img.substr(5), div)
foundImages.push(img.substr(5))
found++
} else if (img.indexOf('http://commons.wikimedia.org/wiki/File:') === 0) {
showWikimediaImage(decodeURIComponent(img.substr(39)), div)
foundImages.push(img.substr(39))
found++
} else if (img.indexOf('https://commons.wikimedia.org/wiki/File:') === 0) {
showWikimediaImage(decodeURIComponent(img.substr(40)), div)
foundImages.push(img.substr(40))
found++
} else {
foundImages.push(img)
showImage(img, div)
found++
}
}
if (data.object.tags.wikidata) {
found++
wikidata.load(data.object.tags.wikidata, function (err, result) {
if (result.claims && result.claims.P18) {
result.claims.P18.forEach(function (d) {
img = d.mainsnak.datavalue.value
if (foundImages.indexOf(img) === -1) {
showWikimediaImage(img, div)
foundImages.push(img)
}
})
}
checkCallback()
})
callbackCount++
}
if (!data.object.tags.wikidata && data.object.tags.wikimedia_commons) {
var value = data.object.tags.wikimedia_commons
if (value.substr(0, 9) === 'Category:') {
found++
ajax('wikimedia', { page: value }, function (result) {
if (result.images) {
result.images.forEach(function (d) {
if (foundImages.indexOf(d) === -1) {
showWikimediaImage(d, div)
foundImages.push(d)
}
})
}
checkCallback()
})
callbackCount++
} else if (value.substr(0, 5) === 'File:') {
found++
if (foundImages.indexOf(value.substr(5)) === -1) {
showWikimediaImage(value.substr(5), div)
foundImages.push(d)
}
}
}
if (found) {
h = document.createElement('h3')
h.appendChild(document.createTextNode(lang('images')))
dom.appendChild(h)
dom.appendChild(div)
}
checkCallback()
function checkCallback () {
callbackCount--
if (callbackCount === 0) {
div.classList.remove('loading')
callback(null)
}
}
})

1
src/index.js

@ -27,6 +27,7 @@ require('./mapLayers')
require('./twigFunctions')
require('./categories')
require('./wikipedia')
require('./image')
window.onload = function () {
initState = config.defaultView

37
src/wikidata.js

@ -0,0 +1,37 @@
var httpGet = require('./httpGet')
var loadClash = {}
var cache = {}
function wikidataLoad (id, callback) {
if (id in cache) {
return callback(null, cache[id])
}
if (id in loadClash) {
loadClash[id].push(callback)
return
}
loadClash[id] = []
httpGet('https://www.wikidata.org/wiki/Special:EntityData/' + id + '.json', function (err, result) {
result = JSON.parse(result.body)
if (!result.entities || !result.entities[id]) {
console.log('invalid result', result)
return callback(err, null)
}
cache[id] = result.entities[id]
callback(null, result.entities[id])
loadClash[id].forEach(function (d) {
d(null, result.entities[id])
})
delete loadClash[id]
})
}
module.exports = {
load: wikidataLoad
}

28
src/wikimedia.php

@ -0,0 +1,28 @@
<?php
function ajax_wikimedia ($param) {
$ret = array();
$wm_url = "https://commons.wikimedia.org/wiki/" . urlencode(strtr($param['page'], array(" " => "_")));
$content = file_get_contents($wm_url);
$dom = new DOMDocument();
$dom->loadHTML($content);
$uls = $dom->getElementsByTagName('ul');//interlanguage-link interwiki-bar');
for ($i = 0; $i < $uls->length; $i++) {
$ul = $uls->item($i);
if ($ul->getAttribute('class') === 'gallery mw-gallery-traditional') {
$imgs = $ul->getElementsByTagName('img');
for ($j = 0; $j < $imgs->length; $j++) {
$ret[] = $imgs->item($j)->getAttribute('alt');
}
}
}
return array(
'images' => $ret,
);
}

108
src/wikipedia.js

@ -1,4 +1,7 @@
var wikidata = require('./wikidata')
var cache = {}
var loadClash = {}
function stripLinks (dom) {
var as = dom.getElementsByTagName('a')
@ -71,6 +74,12 @@ function get (value, callback) {
return callback(null, cache[cacheId])
}
if (cacheId in loadClash) {
loadClash[cacheId].push(callback)
return
}
loadClash[cacheId] = []
ajax('wikipedia',
{
page: value,
@ -87,6 +96,11 @@ function get (value, callback) {
cache[cacheId] = text
callback(null, text)
loadClash[cacheId].forEach(function (d) {
d(null, text)
})
delete loadClash[cacheId]
}
)
}
@ -94,29 +108,39 @@ function get (value, callback) {
register_hook('show-details', function (data, category, dom, callback) {
var ob = data.object
var found = 0
var foundPrefixes = []
var finished = 0
var errs = []
var h
var h, k, m
var div = document.createElement('div')
div.className = 'wikipedia'
if ('wikipedia' in ob.tags) {
found++
foundPrefixes.push('')
showWikipedia(ob.tags.wikipedia, div, done)
}
for (var k in ob.tags) {
var m
for (k in ob.tags) {
if (m = k.match(/^(.*):wikipedia$/)) {
h = document.createElement('h4')
h.appendChild(document.createTextNode(lang('tag:' + m[1])))
div.appendChild(h)
found++
foundPrefixes.push(m[1])
showWikipedia(ob.tags[k], div, done)
}
if (m = k.match(/^((.*):)?wikipedia:(.*)$/)) {
if (typeof m[1] === 'undefined' && foundPrefixes.indexOf('') !== -1) {
continue
}
if (foundPrefixes.indexOf(m[1]) !== -1) {
continue
}
if (m[1]) {
h = document.createElement('h4')
h.appendChild(document.createTextNode(lang('tag:' + m[1])))
@ -124,10 +148,88 @@ register_hook('show-details', function (data, category, dom, callback) {
}
found++
foundPrefixes.push(m[1])
showWikipedia(m[3] + ':' + ob.tags[k], div, done)
}
}
if (ob.tags.wikidata && foundPrefixes.indexOf('') === -1) {
found++
foundPrefixes.push('')
wikidata.load(ob.tags[k], function (err, result) {
var x
if (err) {
return done(err)
}
if (!result.sitelinks) {
return done(new Error('No Wikipedia links defined for Wikidata'))
}
if (options.data_lang + 'wiki' in result.sitelinks) {
x = result.sitelinks[options.data_lang + 'wiki']
return showWikipedia(options.data_lang + ':' + x.title, div, done)
}
for (k in result.sitelinks) {
if (k === 'commonswiki') {
continue
}
x = result.sitelinks[k]
m = k.match(/^(.*)wiki$/)
return showWikipedia(m[1] + ':' + x.title, div, done)
}
done()
})
}
for (k in ob.tags) {
if (m = k.match(/^(.*):wikidata$/)) {
found ++
if (foundPrefixes.indexOf(m[1]) !== -1) {
continue
}
foundPrefixes.push(m[1])
wikidata.load(ob.tags[k], function (prefix, err, result) {
var x
if (err) {
return done(err)
}
if (!result.sitelinks) {
return done()
}
h = document.createElement('h4')
h.appendChild(document.createTextNode(lang('tag:' + prefix)))
div.appendChild(h)
if (options.data_lang + 'wiki' in result.sitelinks) {
x = result.sitelinks[options.data_lang + 'wiki']
return showWikipedia(options.data_lang + ':' + x.title, div, done)
}
for (k in result.sitelinks) {
if (k === 'commonswiki') {
continue
}
x = result.sitelinks[k]
m = k.match(/^(.*)wiki$/)
return showWikipedia(m[1] + ':' + x.title, div, done)
}
done()
}.bind(this, m[1]))
}
}
if (found) {
h = document.createElement('h3')
h.appendChild(document.createTextNode(lang('tag:wikipedia')))

2
src/wikipedia.php

@ -22,7 +22,7 @@ function ajax_wikipedia ($param) {
for ($i = 0; $i < $langDiv->length; $i++) {
$li = $langDiv->item($i);
if (preg_match('/^interlanguage-link interwiki-(.*)$/', $li->getAttribute('class'), $m)) {
if (preg_match('/^interlanguage-link interwiki-([a-z\-]+)( .*|)$/', $li->getAttribute('class'), $m)) {
$a = $li->firstChild;
$langList[$m[1]] = $a->getAttribute('href');
}

7
style.css

@ -519,3 +519,10 @@ a.showDetails {
.wikipedia .reference {
display: none;
}
#contentDetails .images {
text-align: center;
}
#contentDetails .images img {
max-width: 100%;
max-height: auto;
}
Loading…
Cancel
Save