contacts-pane 3.0.2 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +53 -1
  2. package/dist/contactsPane.js +6487 -763
  3. package/dist/contactsPane.js.map +1 -1
  4. package/dist/contactsPane.min.js +2 -0
  5. package/dist/contactsPane.min.js.map +1 -0
  6. package/dist/styles/contactsPane.css +602 -0
  7. package/dist/styles/contactsRDFFormsEnforced.css +513 -0
  8. package/dist/styles/groupMembership.css +115 -0
  9. package/dist/styles/individual.css +12 -0
  10. package/dist/styles/localUtils.css +49 -0
  11. package/dist/styles/mugshotGallery.css +17 -0
  12. package/dist/styles/toolsPane.css +43 -0
  13. package/dist/styles/utilities.css +69 -0
  14. package/dist/styles/webidControl.css +90 -0
  15. package/package.json +23 -17
  16. package/dist/autocompleteBar.d.ts +0 -3
  17. package/dist/autocompleteBar.d.ts.map +0 -1
  18. package/dist/autocompleteBar.js +0 -90
  19. package/dist/autocompleteBar.js.map +0 -1
  20. package/dist/autocompleteField.d.ts +0 -20
  21. package/dist/autocompleteField.d.ts.map +0 -1
  22. package/dist/autocompleteField.js +0 -165
  23. package/dist/autocompleteField.js.map +0 -1
  24. package/dist/autocompletePicker.d.ts +0 -15
  25. package/dist/autocompletePicker.d.ts.map +0 -1
  26. package/dist/autocompletePicker.js +0 -253
  27. package/dist/autocompletePicker.js.map +0 -1
  28. package/dist/contactLogic.js +0 -223
  29. package/dist/contactLogic.js.map +0 -1
  30. package/dist/groupMembershipControl.js +0 -107
  31. package/dist/groupMembershipControl.js.map +0 -1
  32. package/dist/individual.js +0 -115
  33. package/dist/individual.js.map +0 -1
  34. package/dist/mintNewAddressBook.js +0 -145
  35. package/dist/mintNewAddressBook.js.map +0 -1
  36. package/dist/mugshotGallery.js +0 -264
  37. package/dist/mugshotGallery.js.map +0 -1
  38. package/dist/publicData.d.ts +0 -82
  39. package/dist/publicData.d.ts.map +0 -1
  40. package/dist/publicData.js +0 -421
  41. package/dist/publicData.js.map +0 -1
  42. package/dist/toolsPane.js +0 -671
  43. package/dist/toolsPane.js.map +0 -1
  44. package/dist/webidControl.js +0 -320
  45. package/dist/webidControl.js.map +0 -1
@@ -1,421 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.escoParameters = exports.dbpediaParameters = exports.AUTOCOMPLETE_LIMIT = void 0;
7
- exports.filterByLanguage = filterByLanguage;
8
- exports.getDbpediaDetails = getDbpediaDetails;
9
- exports.getPreferredLanguages = getPreferredLanguages;
10
- exports.getWikidataDetails = getWikidataDetails;
11
- exports.getWikidataDetailsOld = getWikidataDetailsOld;
12
- exports.getWikidataLocation = getWikidataLocation;
13
- exports.loadFromBindings = loadFromBindings;
14
- exports.loadPublicDataThing = loadPublicDataThing;
15
- exports.predMap = void 0;
16
- exports.queryESCODataByName = queryESCODataByName;
17
- exports.queryPublicDataByName = queryPublicDataByName;
18
- exports.queryPublicDataConstruct = queryPublicDataConstruct;
19
- exports.queryPublicDataSelect = queryPublicDataSelect;
20
- exports.wikidataParameters = exports.wikidataClasses = exports.wikidataClassMap = void 0;
21
- var _rdflib = require("rdflib");
22
- var _solidLogic = require("solid-logic");
23
- var _solidUi = require("solid-ui");
24
- /* Logic to access public data stores
25
- *
26
- * including filtering resut by natural language etc
27
- */
28
- /* babel-plugin-inline-import './instituteDetailsQuery.sparql' */
29
- const instituteDetailsQuery = "prefix vcard: <http://www.w3.org/2006/vcard/ns#>\nCONSTRUCT\n{ wd:Q49108 vcard:fn ?itemLabel.\nwd:Q49108 rdf:type ?klass. ?klass rdfs:label ?klassLabel; rdfs:comment ?klassDescription .\nwd:Q49108 schema:logo ?logo;\n schema:image ?image;\n schema:logo ?sealImage;\n schema:subOrganization ?subsidiary .\n ?subsidiary rdfs:label ?subsidiaryLabel .\n ?supersidiary schema:subOrganization wd:Q49108 .\n ?supersidiary rdfs:label ?supersidiaryLabel .\n wd:Q49108 schema:location ?location .\n ?location schema:elevation ?elevation .\n ?location wdt:P131 ?region . ?region rdfs:label ?regionLabel .\n ?location wdt:P625 ?coordinates .\n ?location schema:country ?country . ?country rdfs:label ?countryLabel .\n}\nWHERE\n{ optional {wd:Q49108 rdfs:label ?itemLabel} .\n optional {wd:Q49108 wdt:P154 ?logo .}\n optional {wd:Q49108 wdt:P31 ?klass .}\n optional {wd:Q49108 wdt:P158 ?sealImage .}\n optional {wd:Q49108 wdt:P18 ?image .}\n\n optional { wd:Q49108 wdt:P355 ?subsidiary . }\n optional { ?supersidiary wdt:P355 wd:Q49108. }\n\n optional { wd:Q49108 wdt:P276 ?location .\n\n optional { ?location schema:eleveation ?elevation }\n optional { ?location wdt:P131 ?region }\n optional { ?location wdt:P625 ?coordinates }\n optional { ?location wdt:P17 ?country }\n }\n SERVICE wikibase:label { bd:serviceParam wikibase:language \"fr,en,de,it\". }\n}\n";
30
- const AUTOCOMPLETE_LIMIT = exports.AUTOCOMPLETE_LIMIT = 3000; // How many to get from server
31
-
32
- const subjectRegexp = /\$\(subject\)/g;
33
- // Schema.org seems to suggest NGOs are non-profit and Corporaions are for-profit
34
- // but doesn't have explicit classes
35
- const wikidataClasses = exports.wikidataClasses = {
36
- Corporation: 'http://www.wikidata.org/entity/Q6881511',
37
- // Enterprise is for-profit
38
- EducationalOrganization: 'http://www.wikidata.org/entity/Q178706',
39
- // insitution
40
- GovernmentOrganization: 'http://www.wikidata.org/entity/Q327333',
41
- // government agency
42
- MedicalOrganization: 'http://www.wikidata.org/entity/Q4287745',
43
- MusicGroup: 'http://www.wikidata.org/entity/Q32178211',
44
- // music organization
45
- NGO: 'http://www.wikidata.org/entity/Q163740',
46
- // nonprofit organization @@
47
- Occupation: 'http://www.wikidata.org/entity/Q28640',
48
- // Profession
49
- // Organization: 'http://www.wikidata.org/entity/Q43229',
50
- Project: 'http://www.wikidata.org/entity/Q170584',
51
- SportsOrganization: 'http://www.wikidata.org/entity/Q4438121'
52
- };
53
- async function getPreferredLanguages() {
54
- return ['fr', 'en', 'de', 'it']; // @@ testing only -- code me later
55
- }
56
- const escoParameters = exports.escoParameters = {
57
- label: 'ESCO',
58
- logo: 'https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif',
59
- searchByNameQuery: undefined,
60
- // No sparql endpoint
61
- searchByNameURI: 'https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)',
62
- endpoint: undefined,
63
- class: {}
64
- };
65
- const dbpediaParameters = exports.dbpediaParameters = {
66
- label: 'DBPedia',
67
- logo: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/DBpediaLogo.svg/263px-DBpediaLogo.svg.png',
68
- searchByNameQuery: `select distinct ?subject, ?name where {
69
- ?subject a $(class); rdfs:label ?name
70
- FILTER regex(?name, "$(name)", "i")
71
- } LIMIT $(limit)`,
72
- endpoint: 'https://dbpedia.org/sparql/',
73
- class: {
74
- AcademicInsitution: 'http://umbel.org/umbel/rc/EducationalOrganization'
75
- }
76
- };
77
- const wikidataParameters = exports.wikidataParameters = {
78
- label: 'WikiData',
79
- logo: 'https://www.wikimedia.org/static/images/project-logos/wikidatawiki.png',
80
- endpoint: 'https://query.wikidata.org/sparql',
81
- class: {
82
- AcademicInsitution: 'http://www.wikidata.org/entity/Q4671277',
83
- Enterprise: 'http://www.wikidata.org/entity/Q6881511',
84
- Business: 'http://www.wikidata.org/entity/Q4830453',
85
- NGO: 'http://www.wikidata.org/entity/Q79913',
86
- CharitableOrganization: 'http://www.wikidata.org/entity/Q708676',
87
- Insitute: 'http://www.wikidata.org/entity/Q1664720'
88
- },
89
- searchByNameQuery: `SELECT ?subject ?name
90
- WHERE {
91
- ?klass wdt:P279* $(class) .
92
- ?subject wdt:P31 ?klass .
93
- ?subject rdfs:label ?name.
94
- FILTER regex(?name, "$(name)", "i")
95
- } LIMIT $(limit) `,
96
- // was SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" }
97
-
98
- insitituteDetailsQuery: `CONSTRUCT
99
- { wd:Q49108 schema:name ?itemLabel;
100
- schema:logo ?logo;
101
- schema:logo ?sealImage;
102
- schema:subOrganization ?subsidiary .
103
- ?subsidiary schema:name ?subsidiaryLabel .
104
- }
105
- WHERE
106
- {
107
- wd:Q49108 # rdfs:label ?itemLabel ;
108
- wdt:P154 ?logo;
109
- wdt:P158 ?sealImage ;
110
- wdt:P355 ?subsidiary .
111
- # ?subsidiary rdfs:label ?subsidiaryLabel .
112
-
113
- SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE], fr". }
114
- }`
115
- };
116
-
117
- /* From an array of bindings with a names for each row,
118
- * remove dupliacte names for the same thing, leaving the user's
119
- * preferred language version
120
- */
121
- function filterByLanguage(bindings, languagePrefs) {
122
- const uris = {};
123
- bindings.forEach(binding => {
124
- // Organize names by their subject
125
- const uri = binding.subject.value;
126
- uris[uri] = uris[uri] || [];
127
- uris[uri].push(binding);
128
- });
129
- const languagePrefs2 = languagePrefs;
130
- languagePrefs2.reverse(); // prefered last
131
-
132
- const slimmed = [];
133
- for (const u in uris) {
134
- // needs hasOwnProperty ?
135
- const bindings = uris[u];
136
- const sortMe = bindings.map(binding => {
137
- return [languagePrefs2.indexOf(binding.name?.['xml:lang'] || ''), binding];
138
- });
139
- sortMe.sort(); // best at th ebottom
140
- sortMe.reverse(); // best at the top
141
- slimmed.push(sortMe[0][1]);
142
- } // map u
143
- console.log(` Filter by language: ${bindings.length} -> ${slimmed.length}`);
144
- return slimmed;
145
- }
146
- var wikidataClassMap = exports.wikidataClassMap = {
147
- 'http://www.wikidata.org/entity/Q15936437': _solidUi.ns.schema('CollegeOrUniversity'),
148
- // research university
149
- 'http://www.wikidata.org/entity/Q1664720': _solidUi.ns.schema('EducationalOrganization'),
150
- // insitute @@
151
- 'http://www.wikidata.org/entity/Q43229': _solidUi.ns.schema('Organization'),
152
- // research university
153
- 'http://www.wikidata.org/entity/Q3918': _solidUi.ns.schema('CollegeOrUniversity'),
154
- // university
155
- 'http://www.wikidata.org/entity/Q170584': _solidUi.ns.schema('Project'),
156
- // university
157
- 'http://www.wikidata.org/entity/Q327333': _solidUi.ns.schema('GovernmentOrganization'),
158
- // gobvt agency
159
- 'http://www.wikidata.org/entity/Q2221906': _solidUi.ns.schema('Place') // geographic location
160
- };
161
- var predMap = exports.predMap = {
162
- // allow other mappings top added in theory
163
- class: _solidUi.ns.rdf('type'),
164
- // logo: ns.schema('logo'),
165
- sealImage: _solidUi.ns.schema('logo'),
166
- // image: ns.schema('image'), defaults to shema
167
- shortName: _solidUi.ns.foaf('nick'),
168
- subsidiary: _solidUi.ns.schema('subOrganization')
169
- };
170
- function loadFromBindings(kb, solidSubject, bindings, doc) {
171
- const results = {};
172
- console.log(`loadFromBindings: subject: ${solidSubject}`);
173
- console.log(` doc: ${doc}`);
174
- bindings.forEach(binding => {
175
- for (const key in binding) {
176
- const result = binding[key];
177
- const combined = JSON.stringify(result); // ( result.type, result.value )
178
- results[key] = results[key] || new Set();
179
- results[key].add(combined); // remove duplicates
180
- }
181
- });
182
- for (const key in results) {
183
- const values = results[key];
184
- console.log(` results ${key} -> ${values}`);
185
- values.forEach(combined => {
186
- const result = JSON.parse(combined);
187
- const {
188
- type,
189
- value
190
- } = result;
191
- let obj;
192
- if (type === 'uri') {
193
- obj = kb.sym(value);
194
- } else if (type === 'literal') {
195
- obj = new _rdflib.Literal(value, result.language, result.datatype);
196
- } else {
197
- throw new Error(`loadFromBindings: unexpected type: ${type}`);
198
- }
199
- if (key === 'type') {
200
- if (wikidataClassMap[value]) {
201
- obj = wikidataClassMap[value];
202
- } else {
203
- console.warn('Unmapped Wikidata Class: ' + value);
204
- }
205
- } else if (key === 'coordinates') {
206
- // const latlong = value // Like 'Point(-71.106111111 42.375)'
207
- console.log(' @@@ hey a point: ' + value);
208
- // eslint-disable-next-line no-useless-escape
209
- const regexp = /.*\(([-0-9\.-]*) ([-0-9\.-]*)\)/;
210
- const match = regexp.exec(value);
211
- if (match) {
212
- const float = _solidUi.ns.xsd('float');
213
- const latitude = new _rdflib.Literal(match[1], null, float);
214
- const longitude = new _rdflib.Literal(match[2], null, float);
215
- kb.add(solidSubject, _solidUi.ns.schema('longitude'), longitude, doc);
216
- kb.add(solidSubject, _solidUi.ns.schema('latitude'), latitude, doc);
217
- }
218
- } else if (predMap[key]) {
219
- const pred = predMap[key] || _solidUi.ns.schema(key); // fallback to just using schema.org
220
- kb.add(solidSubject, pred, obj, doc); // @@ deal with non-string and objects
221
- console.log(` public data ${pred} ${obj}.`);
222
- }
223
- });
224
- }
225
- }
226
-
227
- /* ESCO sopecific
228
- */
229
-
230
- /* Query all entities of given class and partially matching name
231
- */
232
- async function queryESCODataByName(filter, theClass, queryTarget) {
233
- if (!queryTarget.searchByNameURI) {
234
- throw new Error('Query target searchByNameURI is required for ESCO queries');
235
- }
236
- const queryURI = queryTarget.searchByNameURI.replace('$(name)', filter).replace('$(limit)', '' + AUTOCOMPLETE_LIMIT).replace('$(class)', theClass.uri);
237
- console.log('Querying ESCO data - uri: ' + queryURI);
238
- const options = {
239
- credentials: 'omit',
240
- headers: {
241
- Accept: 'application/json'
242
- }
243
- }; // CORS
244
- const response = await _solidLogic.store.fetcher.webOperation('GET', queryURI, options);
245
- // complain('Error querying db of organizations: ' + err)
246
- const text = response.responseText;
247
- if (!text) throw new Error('No response text from ESCO query ' + queryURI);
248
- console.log(' Query result text' + text.slice(0, 500) + '...');
249
- if (text.length === 0) throw new Error('Wot no text back from ESCO query ' + queryURI);
250
- const json = JSON.parse(text);
251
- console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...');
252
- const results = json._embedded.results; // Array
253
- const bindings = results.map(result => {
254
- const name = result.title;
255
- const uri = result.uri; // like http://data.europa.eu/esco/occupation/57af9090-55b4-4911-b2d0-86db01c00b02
256
- return {
257
- name: {
258
- value: name,
259
- type: 'literal'
260
- },
261
- uri: {
262
- type: 'IRI',
263
- value: uri
264
- }
265
- }; // simulate SPARQL bindings
266
- });
267
- return bindings;
268
- // return queryPublicDataSelect(sparql, queryTarget)
269
- }
270
-
271
- /* Query all entities of given class and partially matching name
272
- */
273
- async function queryPublicDataByName(filter, theClass, queryTarget) {
274
- const sparql = queryTarget.searchByNameQuery.replace('$(name)', filter).replace('$(limit)', '' + AUTOCOMPLETE_LIMIT).replace('$(class)', theClass.uri);
275
- console.log('Querying public data - sparql: ' + sparql);
276
- return queryPublicDataSelect(sparql, queryTarget);
277
- }
278
- async function queryPublicDataSelect(sparql, queryTarget) {
279
- if (!queryTarget.endpoint) {
280
- throw new Error('Query target endpoint is required');
281
- }
282
- const myUrlWithParams = new URL(queryTarget.endpoint);
283
- myUrlWithParams.searchParams.append('query', sparql);
284
- const queryURI = myUrlWithParams.href;
285
- console.log(' queryPublicDataSelect uri: ' + queryURI);
286
- const options = {
287
- credentials: 'omit',
288
- headers: {
289
- Accept: 'application/json'
290
- }
291
- }; // CORS
292
- const response = await _solidLogic.store.fetcher.webOperation('GET', queryURI, options);
293
- // complain('Error querying db of organizations: ' + err)
294
- const text = response.responseText;
295
- // console.log(' Query result text' + text.slice(0,100) + '...')
296
- if (!text || text.length === 0) {
297
- throw new Error('Wot no text back from query ' + queryURI);
298
- } else {
299
- const json = JSON.parse(text);
300
- console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 100) + '...');
301
- const bindings = json.results.bindings;
302
- return bindings;
303
- }
304
- }
305
- async function queryPublicDataConstruct(sparql, publicId, queryTarget) {
306
- console.log('queryPublicDataConstruct: sparql:', sparql);
307
- if (!queryTarget.endpoint) {
308
- throw new Error('Query target endpoint is required');
309
- }
310
- const myUrlWithParams = new URL(queryTarget.endpoint);
311
- myUrlWithParams.searchParams.append('query', sparql);
312
- const queryURI = myUrlWithParams.href;
313
- console.log(' queryPublicDataConstruct uri: ' + queryURI);
314
- const options = {
315
- credentials: 'omit',
316
- // CORS
317
- headers: {
318
- Accept: 'text/turtle'
319
- }
320
- };
321
- const response = await _solidLogic.store.fetcher.webOperation('GET', queryURI, options);
322
- const text = response.responseText;
323
- const report = text && text.length > 500 ? text.slice(0, 200) + ' ... ' + text.slice(-200) : text;
324
- console.log(' queryPublicDataConstruct result text:' + report);
325
- if (!text || text.length === 0) {
326
- throw new Error('queryPublicDataConstruct: No text back from construct query:' + queryURI);
327
- } else {
328
- (0, _rdflib.parse)(text, _solidLogic.store, publicId.uri, 'text/turtle');
329
- }
330
- }
331
- async function loadPublicDataThing(kb, subject, publicDataID) {
332
- if (publicDataID.uri.startsWith('https://dbpedia.org/resource/')) {
333
- return getDbpediaDetails(kb, subject, publicDataID);
334
- } else if (publicDataID.uri.match(/^https?:\/\/www\.wikidata\.org\/entity\/.*/)) {
335
- // Previous approach:
336
- // const QId = publicDataID.uri.split('/')[4]
337
- // const dataURI = `http://www.wikidata.org/wiki/Special:EntityData/${QId}.ttl`
338
- // Not used because loading the data URI gives much too much irrelevant data from Wikidata.
339
- await getWikidataDetails(kb, subject, publicDataID);
340
- // await getWikidataLocation(kb, subject, publicDataID) -- should get that in the details query now
341
- } else {
342
- const iDToFetch = publicDataID.uri.startsWith('http:') ? kb.sym('https:' + publicDataID.uri.slice(5)) : publicDataID;
343
- return kb.fetcher.load(iDToFetch, {
344
- credentials: 'omit',
345
- headers: {
346
- Accept: 'text/turtle'
347
- }
348
- });
349
- }
350
- }
351
- async function getWikidataDetails(kb, solidSubject, publicDataID) {
352
- const subjRegexp = /wd:Q49108/g;
353
- const sparql = instituteDetailsQuery.replace(subjRegexp, publicDataID.value);
354
- await queryPublicDataConstruct(sparql, publicDataID, wikidataParameters);
355
- console.log('getWikidataDetails: loaded.', publicDataID);
356
- }
357
- async function getWikidataDetailsOld(kb, solidSubject, publicDataID) {
358
- const sparql = `select distinct * where {
359
- optional { $(subject) wdt:P31 ?class } # instance of
360
- optional { $(subject) wdt:P154 ?logo }
361
- optional { $(subject) wdt:P158 ?sealImage }
362
- # optional { $(subject) wdt:P159 ?headquartersLocation }
363
-
364
- optional { $(subject) wdt:P17 ?country }
365
- optional { $(subject) wdt:P18 ?image }
366
- optional { $(subject) wdt:P1813 ?shortName }
367
-
368
- optional { $(subject) wdt:P355 ?subsidiary }
369
- # SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en,de,it" }
370
- }`.replace(subjectRegexp, publicDataID.uri);
371
- const bindings = await queryPublicDataSelect(sparql, wikidataParameters);
372
- loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()); // arg2 was solidSubject
373
- }
374
- async function getWikidataLocation(kb, solidSubject, publicDataID) {
375
- const sparql = `select distinct * where {
376
-
377
- $(subject) wdt:P276 ?location .
378
-
379
- optional { ?location wdt:P2044 ?elevation }
380
- optional { ?location wdt:P131 ?region }
381
- optional { ?location wdt:P625 ?coordinates }
382
- optional { ?location wdt:P17 ?country }
383
-
384
- # SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en,de,it" }
385
- }`.replace(subjectRegexp, publicDataID.uri);
386
- console.log(' location query sparql:' + sparql);
387
- const bindings = await queryPublicDataSelect(sparql, wikidataParameters);
388
- console.log(' location query bindings:', bindings);
389
- loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()); // was solidSubject
390
- }
391
- async function getDbpediaDetails(kb, solidSubject, publicDataID) {
392
- // Note below the string form of the named node with <> works in SPARQL
393
- const sparql = `select distinct ?city, ?state, ?country, ?homepage, ?logo, ?lat, ?long, WHERE {
394
- OPTIONAL { <${publicDataID}> <http://dbpedia.org/ontology/city> ?city }
395
- OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/state> ?state }
396
- OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/country> ?country }
397
- OPTIONAL { ${publicDataID} foaf:homepage ?homepage }
398
- OPTIONAL { ${publicDataID} foaf:lat ?lat; foaf:long ?long }
399
- OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/country> ?country }
400
- }`;
401
- /*
402
- const predMap = {
403
- city: ns.vcard('locality'),
404
- state: ns.vcard('region'),
405
- country: ns.vcard('country-name'),
406
- homepage: ns.foaf('homepage'),
407
- lat: ns.geo('latitude'),
408
- long: ns.geo('longitude'),
409
- }
410
- */
411
- const bindings = await queryPublicDataSelect(sparql, dbpediaParameters);
412
- return bindings.map(binding => {
413
- const uri = binding.subject.value; // @@ To be written
414
- const name = binding.name?.value;
415
- return {
416
- uri,
417
- name
418
- };
419
- });
420
- }
421
- //# sourceMappingURL=publicData.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"publicData.js","names":["_rdflib","require","_solidLogic","_solidUi","instituteDetailsQuery","AUTOCOMPLETE_LIMIT","exports","subjectRegexp","wikidataClasses","Corporation","EducationalOrganization","GovernmentOrganization","MedicalOrganization","MusicGroup","NGO","Occupation","Project","SportsOrganization","getPreferredLanguages","escoParameters","label","logo","searchByNameQuery","undefined","searchByNameURI","endpoint","class","dbpediaParameters","AcademicInsitution","wikidataParameters","Enterprise","Business","CharitableOrganization","Insitute","insitituteDetailsQuery","filterByLanguage","bindings","languagePrefs","uris","forEach","binding","uri","subject","value","push","languagePrefs2","reverse","slimmed","u","sortMe","map","indexOf","name","sort","console","log","length","wikidataClassMap","ns","schema","predMap","rdf","sealImage","shortName","foaf","subsidiary","loadFromBindings","kb","solidSubject","doc","results","key","result","combined","JSON","stringify","Set","add","values","parse","type","obj","sym","Literal","language","datatype","Error","warn","regexp","match","exec","float","xsd","latitude","longitude","pred","queryESCODataByName","filter","theClass","queryTarget","queryURI","replace","options","credentials","headers","Accept","response","store","fetcher","webOperation","text","responseText","slice","json","_embedded","title","queryPublicDataByName","sparql","queryPublicDataSelect","myUrlWithParams","URL","searchParams","append","href","queryPublicDataConstruct","publicId","report","loadPublicDataThing","publicDataID","startsWith","getDbpediaDetails","getWikidataDetails","iDToFetch","load","subjRegexp","getWikidataDetailsOld","getWikidataLocation"],"sources":["../src/publicData.ts"],"sourcesContent":["/* Logic to access public data stores\n*\n* including filtering resut by natural language etc\n*/\nimport { Literal, NamedNode, parse } from 'rdflib'\nimport { store } from 'solid-logic'\nimport { ns } from 'solid-ui'\nimport instituteDetailsQuery from './instituteDetailsQuery.sparql'\n\nexport const AUTOCOMPLETE_LIMIT = 3000 // How many to get from server\n\nconst subjectRegexp = /\\$\\(subject\\)/g\n\ninterface Term {\n type: string;\n value: string\n}\n\ninterface Binding {\n subject: Term;\n name?: Term\n location?: Term\n coordinates?: Term\n}\n\ntype Bindings = Binding[]\n\nexport type QueryParameters =\n{\n label: string;\n logo: string;\n searchByNameQuery?: string;\n searchByNameURI?: string;\n insitituteDetailsQuery?: string;\n endpoint?: string;\n class: object\n}\n\n// Schema.org seems to suggest NGOs are non-profit and Corporaions are for-profit\n// but doesn't have explicit classes\nexport const wikidataClasses = {\n Corporation: 'http://www.wikidata.org/entity/Q6881511', // Enterprise is for-profit\n EducationalOrganization: 'http://www.wikidata.org/entity/Q178706', // insitution\n GovernmentOrganization: 'http://www.wikidata.org/entity/Q327333', // government agency\n MedicalOrganization: 'http://www.wikidata.org/entity/Q4287745',\n MusicGroup: 'http://www.wikidata.org/entity/Q32178211', // music organization\n NGO: 'http://www.wikidata.org/entity/Q163740', // nonprofit organization @@\n Occupation: 'http://www.wikidata.org/entity/Q28640', // Profession\n // Organization: 'http://www.wikidata.org/entity/Q43229',\n Project: 'http://www.wikidata.org/entity/Q170584',\n SportsOrganization: 'http://www.wikidata.org/entity/Q4438121',\n}\n\nexport async function getPreferredLanguages () {\n return ['fr', 'en', 'de', 'it'] // @@ testing only -- code me later\n}\nexport const escoParameters:QueryParameters = {\n label: 'ESCO',\n logo: 'https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif',\n searchByNameQuery: undefined, // No sparql endpoint\n searchByNameURI: 'https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)',\n endpoint: undefined,\n class: {}\n}\n\nexport const dbpediaParameters:QueryParameters = {\n label: 'DBPedia',\n logo: 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/DBpediaLogo.svg/263px-DBpediaLogo.svg.png',\n searchByNameQuery: `select distinct ?subject, ?name where {\n ?subject a $(class); rdfs:label ?name\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit)`,\n endpoint: 'https://dbpedia.org/sparql/',\n class: { AcademicInsitution: 'http://umbel.org/umbel/rc/EducationalOrganization' }\n}\n\nexport const wikidataParameters = {\n label: 'WikiData',\n logo: 'https://www.wikimedia.org/static/images/project-logos/wikidatawiki.png',\n endpoint: 'https://query.wikidata.org/sparql',\n class: {\n AcademicInsitution: 'http://www.wikidata.org/entity/Q4671277',\n Enterprise: 'http://www.wikidata.org/entity/Q6881511',\n Business: 'http://www.wikidata.org/entity/Q4830453',\n NGO: 'http://www.wikidata.org/entity/Q79913',\n CharitableOrganization: 'http://www.wikidata.org/entity/Q708676',\n Insitute: 'http://www.wikidata.org/entity/Q1664720',\n },\n searchByNameQuery: `SELECT ?subject ?name\n WHERE {\n ?klass wdt:P279* $(class) .\n ?subject wdt:P31 ?klass .\n ?subject rdfs:label ?name.\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit) `, // was SERVICE wikibase:label { bd:serviceParam wikibase:language \"[AUTO_LANGUAGE],en\" }\n\n insitituteDetailsQuery: `CONSTRUCT\n{ wd:Q49108 schema:name ?itemLabel;\n schema:logo ?logo;\n schema:logo ?sealImage;\n schema:subOrganization ?subsidiary .\n ?subsidiary schema:name ?subsidiaryLabel .\n}\nWHERE\n{\n wd:Q49108 # rdfs:label ?itemLabel ;\n wdt:P154 ?logo;\n wdt:P158 ?sealImage ;\n wdt:P355 ?subsidiary .\n # ?subsidiary rdfs:label ?subsidiaryLabel .\n\n SERVICE wikibase:label { bd:serviceParam wikibase:language \"[AUTO_LANGUAGE], fr\". }\n}`\n}\n\n/* From an array of bindings with a names for each row,\n * remove dupliacte names for the same thing, leaving the user's\n * preferred language version\n*/\nexport function filterByLanguage (bindings: Bindings, languagePrefs: string[]): Bindings {\n const uris: Record<string, Binding[]> = {}\n bindings.forEach(binding => { // Organize names by their subject\n const uri = binding.subject.value\n uris[uri] = uris[uri] || []\n uris[uri].push(binding)\n })\n\n const languagePrefs2 = languagePrefs\n languagePrefs2.reverse() // prefered last\n\n const slimmed: Binding[] = []\n for (const u in uris) { // needs hasOwnProperty ?\n const bindings = uris[u]\n const sortMe = bindings.map(binding => {\n return [languagePrefs2.indexOf(binding.name?.['xml:lang'] || ''), binding]\n })\n sortMe.sort() // best at th ebottom\n sortMe.reverse() // best at the top\n slimmed.push(sortMe[0][1] as Binding)\n } // map u\n console.log(` Filter by language: ${bindings.length} -> ${slimmed.length}`)\n return slimmed\n}\n\nexport var wikidataClassMap = {\n 'http://www.wikidata.org/entity/Q15936437': ns.schema('CollegeOrUniversity'), // research university\n 'http://www.wikidata.org/entity/Q1664720': ns.schema('EducationalOrganization'), // insitute @@\n 'http://www.wikidata.org/entity/Q43229': ns.schema('Organization'), // research university\n 'http://www.wikidata.org/entity/Q3918': ns.schema('CollegeOrUniversity'), // university\n 'http://www.wikidata.org/entity/Q170584': ns.schema('Project'), // university\n 'http://www.wikidata.org/entity/Q327333': ns.schema('GovernmentOrganization'), // gobvt agency\n 'http://www.wikidata.org/entity/Q2221906': ns.schema('Place'), // geographic location\n\n}\nexport var predMap = { // allow other mappings top added in theory\n class: ns.rdf('type'),\n // logo: ns.schema('logo'),\n sealImage: ns.schema('logo'),\n // image: ns.schema('image'), defaults to shema\n shortName: ns.foaf('nick'),\n subsidiary: ns.schema('subOrganization')\n}\n\nexport function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc) {\n const results = {}\n console.log(`loadFromBindings: subject: ${solidSubject}`)\n console.log(` doc: ${doc}`)\n bindings.forEach(binding => {\n for (const key in binding) {\n const result = binding[key]\n const combined = JSON.stringify(result) // ( result.type, result.value )\n results[key] = results[key] || new Set()\n results[key].add(combined) // remove duplicates\n }\n })\n for (const key in results) {\n const values = results[key]\n console.log(` results ${key} -> ${values}`)\n values.forEach(combined => {\n const result = JSON.parse(combined)\n const { type, value } = result\n let obj\n if (type === 'uri') {\n obj = kb.sym(value)\n } else if (type === 'literal') {\n obj = new Literal(value, result.language, result.datatype)\n } else {\n throw new Error(`loadFromBindings: unexpected type: ${type}`)\n }\n if (key === 'type') {\n if (wikidataClassMap[value]) {\n obj = wikidataClassMap[value]\n } else {\n console.warn('Unmapped Wikidata Class: ' + value)\n }\n } else if (key === 'coordinates') {\n // const latlong = value // Like 'Point(-71.106111111 42.375)'\n console.log(' @@@ hey a point: ' + value)\n // eslint-disable-next-line no-useless-escape\n const regexp = /.*\\(([-0-9\\.-]*) ([-0-9\\.-]*)\\)/\n const match = regexp.exec(value)\n if (match) {\n const float = ns.xsd('float')\n const latitude = new Literal(match[1], null, float)\n const longitude = new Literal(match[2], null, float)\n kb.add(solidSubject, ns.schema('longitude'), longitude, doc)\n kb.add(solidSubject, ns.schema('latitude'), latitude, doc)\n }\n } else if (predMap[key]) {\n const pred = predMap[key] || ns.schema(key) // fallback to just using schema.org\n kb.add(solidSubject, pred, obj, doc) // @@ deal with non-string and objects\n console.log(` public data ${pred} ${obj}.`)\n }\n })\n }\n}\n\n/* ESCO sopecific\n*/\n\n/* Query all entities of given class and partially matching name\n*/\nexport async function queryESCODataByName (filter: string, theClass:NamedNode, queryTarget: QueryParameters): Promise<Bindings> {\n if (!queryTarget.searchByNameURI) {\n throw new Error('Query target searchByNameURI is required for ESCO queries')\n }\n const queryURI = queryTarget.searchByNameURI\n .replace('$(name)', filter)\n .replace('$(limit)', '' + AUTOCOMPLETE_LIMIT)\n .replace('$(class)', theClass.uri)\n console.log('Querying ESCO data - uri: ' + queryURI)\n\n const options = {\n credentials: 'omit' as const,\n headers: { Accept: 'application/json' }\n } // CORS\n const response = await store.fetcher.webOperation('GET', queryURI, options)\n // complain('Error querying db of organizations: ' + err)\n const text = response.responseText\n if (!text) throw new Error('No response text from ESCO query ' + queryURI)\n console.log(' Query result text' + text.slice(0, 500) + '...')\n if (text.length === 0) throw new Error('Wot no text back from ESCO query ' + queryURI)\n const json = JSON.parse(text)\n console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n\n const results = json._embedded.results // Array\n const bindings = results.map(result => {\n const name = result.title\n const uri = result.uri // like http://data.europa.eu/esco/occupation/57af9090-55b4-4911-b2d0-86db01c00b02\n return { name: { value: name, type: 'literal' }, uri: { type: 'IRI', value: uri } } // simulate SPARQL bindings\n })\n return bindings\n // return queryPublicDataSelect(sparql, queryTarget)\n}\n\n/* Query all entities of given class and partially matching name\n*/\nexport async function queryPublicDataByName (filter: string, theClass:NamedNode, queryTarget: QueryParameters): Promise<Bindings> {\n const sparql = queryTarget.searchByNameQuery!\n .replace('$(name)', filter)\n .replace('$(limit)', '' + AUTOCOMPLETE_LIMIT)\n .replace('$(class)', theClass.uri)\n console.log('Querying public data - sparql: ' + sparql)\n return queryPublicDataSelect(sparql, queryTarget)\n}\n\nexport async function queryPublicDataSelect (sparql: string, queryTarget: QueryParameters): Promise<Bindings> {\n if (!queryTarget.endpoint) {\n throw new Error('Query target endpoint is required')\n }\n const myUrlWithParams = new URL(queryTarget.endpoint!)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n console.log(' queryPublicDataSelect uri: ' + queryURI)\n\n const options = {\n credentials: 'omit' as const,\n headers: { Accept: 'application/json' }\n } // CORS\n const response = await store.fetcher.webOperation('GET', queryURI, options)\n // complain('Error querying db of organizations: ' + err)\n const text = response.responseText\n // console.log(' Query result text' + text.slice(0,100) + '...')\n if (!text || text.length === 0) { throw new Error('Wot no text back from query ' + queryURI) } else {\n const json = JSON.parse(text)\n console.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 100) + '...')\n const bindings = json.results.bindings\n return bindings\n }\n}\n\nexport async function queryPublicDataConstruct (sparql: string, publicId: NamedNode, queryTarget: QueryParameters): Promise<void> {\n console.log('queryPublicDataConstruct: sparql:', sparql)\n if (!queryTarget.endpoint) {\n throw new Error('Query target endpoint is required')\n }\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n console.log(' queryPublicDataConstruct uri: ' + queryURI)\n const options = {\n credentials: 'omit' as const, // CORS\n headers: { Accept: 'text/turtle' }\n }\n const response = await store.fetcher.webOperation('GET', queryURI, options)\n const text = response.responseText\n const report = text && text.length > 500 ? text.slice(0, 200) + ' ... ' + text.slice(-200) : text\n console.log(' queryPublicDataConstruct result text:' + report)\n if (!text || text.length === 0) { throw new Error('queryPublicDataConstruct: No text back from construct query:' + queryURI) } else { parse(text, store, publicId.uri, 'text/turtle') }\n}\n\nexport async function loadPublicDataThing (kb, subject: NamedNode, publicDataID: NamedNode) {\n if (publicDataID.uri.startsWith('https://dbpedia.org/resource/')) {\n return getDbpediaDetails(kb, subject, publicDataID)\n } else if (publicDataID.uri.match(/^https?:\\/\\/www\\.wikidata\\.org\\/entity\\/.*/)) {\n // Previous approach:\n // const QId = publicDataID.uri.split('/')[4]\n // const dataURI = `http://www.wikidata.org/wiki/Special:EntityData/${QId}.ttl`\n // Not used because loading the data URI gives much too much irrelevant data from Wikidata.\n await getWikidataDetails(kb, subject, publicDataID)\n // await getWikidataLocation(kb, subject, publicDataID) -- should get that in the details query now\n } else {\n const iDToFetch = publicDataID.uri.startsWith('http:')\n ? kb.sym('https:' + publicDataID.uri.slice(5))\n : publicDataID\n return kb.fetcher.load(iDToFetch, {\n credentials: 'omit',\n headers: { Accept: 'text/turtle' }\n })\n }\n}\n\nexport async function getWikidataDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const subjRegexp = /wd:Q49108/g\n const sparql = instituteDetailsQuery.replace(subjRegexp, publicDataID.value)\n await queryPublicDataConstruct(sparql, publicDataID, wikidataParameters)\n console.log('getWikidataDetails: loaded.', publicDataID)\n}\n\nexport async function getWikidataDetailsOld (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const sparql = `select distinct * where {\n optional { $(subject) wdt:P31 ?class } # instance of\n optional { $(subject) wdt:P154 ?logo }\n optional { $(subject) wdt:P158 ?sealImage }\n# optional { $(subject) wdt:P159 ?headquartersLocation }\n\noptional { $(subject) wdt:P17 ?country }\noptional { $(subject) wdt:P18 ?image }\noptional { $(subject) wdt:P1813 ?shortName }\n\noptional { $(subject) wdt:P355 ?subsidiary }\n# SERVICE wikibase:label { bd:serviceParam wikibase:language \"fr,en,de,it\" }\n}`\n .replace(subjectRegexp, publicDataID.uri)\n const bindings = await queryPublicDataSelect(sparql, wikidataParameters)\n loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()) // arg2 was solidSubject\n}\n\nexport async function getWikidataLocation (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const sparql = `select distinct * where {\n\n $(subject) wdt:P276 ?location .\n\n optional { ?location wdt:P2044 ?elevation }\n optional { ?location wdt:P131 ?region }\n optional { ?location wdt:P625 ?coordinates }\noptional { ?location wdt:P17 ?country }\n\n# SERVICE wikibase:label { bd:serviceParam wikibase:language \"fr,en,de,it\" }\n}`.replace(subjectRegexp, publicDataID.uri)\n console.log(' location query sparql:' + sparql)\n const bindings = await queryPublicDataSelect(sparql, wikidataParameters)\n console.log(' location query bindings:', bindings)\n loadFromBindings(kb, publicDataID, bindings, publicDataID.doc()) // was solidSubject\n}\n\nexport async function getDbpediaDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n// Note below the string form of the named node with <> works in SPARQL\n const sparql = `select distinct ?city, ?state, ?country, ?homepage, ?logo, ?lat, ?long, WHERE {\n OPTIONAL { <${publicDataID}> <http://dbpedia.org/ontology/city> ?city }\n OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/state> ?state }\n OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/country> ?country }\n OPTIONAL { ${publicDataID} foaf:homepage ?homepage }\n OPTIONAL { ${publicDataID} foaf:lat ?lat; foaf:long ?long }\n OPTIONAL { ${publicDataID} <http://dbpedia.org/ontology/country> ?country }\n }`\n /*\n const predMap = {\n city: ns.vcard('locality'),\n state: ns.vcard('region'),\n country: ns.vcard('country-name'),\n homepage: ns.foaf('homepage'),\n lat: ns.geo('latitude'),\n long: ns.geo('longitude'),\n }\n */\n const bindings = await queryPublicDataSelect(sparql, dbpediaParameters)\n return bindings.map(binding => {\n const uri = binding.subject.value // @@ To be written\n const name = binding.name?.value\n return { uri, name }\n })\n}\n"],"mappings":"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","ignoreList":[]}