solid-ui 3.1.3-13 → 3.1.3-15
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.
- package/README.md +0 -14
- package/dist/_virtual/_rolldown/runtime.cjs.js +1 -1
- package/dist/acl/access-controller.cjs.js.map +1 -1
- package/dist/acl/access-groups.cjs.js +1 -1
- package/dist/acl/access-groups.cjs.js.map +1 -1
- package/dist/acl/access-groups.esm.js +2 -1
- package/dist/acl/access-groups.esm.js.map +1 -1
- package/dist/acl/acl.cjs.js.map +1 -1
- package/dist/acl/acl.esm.js.map +1 -1
- package/dist/chat/bookmarks.esm.js +2 -1
- package/dist/chat/bookmarks.esm.js.map +1 -1
- package/dist/chat/chatLogic.cjs.js +1 -1
- package/dist/chat/chatLogic.cjs.js.map +1 -1
- package/dist/chat/chatLogic.esm.js +2 -2
- package/dist/chat/chatLogic.esm.js.map +1 -1
- package/dist/chat/keys.cjs.js +1 -1
- package/dist/chat/keys.cjs.js.map +1 -1
- package/dist/chat/keys.d.ts +1 -1
- package/dist/chat/keys.d.ts.map +1 -1
- package/dist/chat/keys.esm.js +5 -2
- package/dist/chat/keys.esm.js.map +1 -1
- package/dist/chat/signature.cjs.js +1 -1
- package/dist/chat/signature.cjs.js.map +1 -1
- package/dist/chat/signature.esm.js +2 -1
- package/dist/chat/signature.esm.js.map +1 -1
- package/dist/chunks/{DialogProvider-B7wEBrVN.js → DialogProvider-0HIHjONx.js} +11 -11
- package/dist/chunks/{DialogProvider-B7wEBrVN.js.map → DialogProvider-0HIHjONx.js.map} +1 -1
- package/dist/chunks/{account-DeNlj01m.js → account-Ch8h_zTv.js} +20 -21
- package/dist/chunks/{account-DeNlj01m.js.map → account-Ch8h_zTv.js.map} +1 -1
- package/dist/chunks/{auth-Knq99zZ9.js → auth-D4NUMSzc.js} +98 -72
- package/dist/chunks/auth-D4NUMSzc.js.map +1 -0
- package/dist/chunks/{avatar-DgO_p94F.js → avatar-BWtz4RlU.js} +7 -8
- package/dist/chunks/{avatar-DgO_p94F.js.map → avatar-BWtz4RlU.js.map} +1 -1
- package/dist/chunks/{button-Dvkek1tx.js → button-BJyFKOKO.js} +12 -15
- package/dist/chunks/{button-Dvkek1tx.js.map → button-BJyFKOKO.js.map} +1 -1
- package/dist/chunks/{chunk.7MPIABXH-DNcYOuE8.js → chunk.64OG2H45-BADxAtEI.js} +97 -50
- package/dist/chunks/chunk.64OG2H45-BADxAtEI.js.map +1 -0
- package/dist/chunks/{combobox-B5j4LoHY.js → combobox-0NWv9K3D.js} +106 -93
- package/dist/chunks/combobox-0NWv9K3D.js.map +1 -0
- package/dist/chunks/{combobox-option-C5lKAumO.js → combobox-option-B-twy1Zn.js} +6 -7
- package/dist/chunks/{combobox-option-C5lKAumO.js.map → combobox-option-B-twy1Zn.js.map} +1 -1
- package/dist/chunks/components-DrP7BOrs.js +1281 -0
- package/dist/chunks/components-DrP7BOrs.js.map +1 -0
- package/dist/chunks/{dialog-DZgm_Tph.js → dialog-CcMVH-Ut.js} +16 -16
- package/dist/chunks/{dialog-DZgm_Tph.js.map → dialog-CcMVH-Ut.js.map} +1 -1
- package/dist/chunks/{dialog-content-DY-ROHyi.js → dialog-content-DcD_s3hK.js} +2 -3
- package/dist/chunks/{dialog-content-DY-ROHyi.js.map → dialog-content-DcD_s3hK.js.map} +1 -1
- package/dist/chunks/{dialog-footer-BAZTjZ8J.js → dialog-footer-CHgSH7G5.js} +2 -3
- package/dist/chunks/{dialog-footer-BAZTjZ8J.js.map → dialog-footer-CHgSH7G5.js.map} +1 -1
- package/dist/chunks/{dialog-header-COzPcK8F.js → dialog-header-BjellR7_.js} +2 -3
- package/dist/chunks/{dialog-header-COzPcK8F.js.map → dialog-header-BjellR7_.js.map} +1 -1
- package/dist/chunks/{dialogs-DEuwXC46.js → dialogs-CeHuLUo5.js} +2 -2
- package/dist/chunks/{dialogs-DEuwXC46.js.map → dialogs-CeHuLUo5.js.map} +1 -1
- package/dist/chunks/{dialogs-root-BYp6fIUE.js → dialogs-root-CvsON-m8.js} +5 -6
- package/dist/chunks/{dialogs-root-BYp6fIUE.js.map → dialogs-root-CvsON-m8.js.map} +1 -1
- package/dist/chunks/{guard-DI4k0FkM.js → guard-BIesxo_f.js} +7 -8
- package/dist/chunks/{guard-DI4k0FkM.js.map → guard-BIesxo_f.js.map} +1 -1
- package/dist/chunks/{solid-logic.esm-BrMdCG2_.js → index.esm-CyyOkz04.js} +2663 -2745
- package/dist/chunks/index.esm-CyyOkz04.js.map +1 -0
- package/dist/chunks/{input-CCpEhtqA.js → input-CFDN76Y5.js} +99 -54
- package/dist/chunks/input-CFDN76Y5.js.map +1 -0
- package/dist/chunks/{jsonld-B61R4iOL.js → jsonld-52q5nY_t.js} +22 -27
- package/dist/chunks/{jsonld-B61R4iOL.js.map → jsonld-52q5nY_t.js.map} +1 -1
- package/dist/chunks/{login-button-BafqiKef.js → login-button-BhdKFJ-F.js} +8 -9
- package/dist/chunks/{login-button-BafqiKef.js.map → login-button-BhdKFJ-F.js.map} +1 -1
- package/dist/chunks/{logout-button-D54NF9EW.js → logout-button-ClbKS9ss.js} +8 -9
- package/dist/chunks/{logout-button-D54NF9EW.js.map → logout-button-ClbKS9ss.js.map} +1 -1
- package/dist/chunks/{menu-DKxtACGA.js → menu-DVgG-el5.js} +39 -35
- package/dist/chunks/menu-DVgG-el5.js.map +1 -0
- package/dist/chunks/{menu-item-D9BqJtKZ.js → menu-item-Bj3NgLzB.js} +5 -6
- package/dist/chunks/{menu-item-D9BqJtKZ.js.map → menu-item-Bj3NgLzB.js.map} +1 -1
- package/dist/chunks/{photo-capture-BoZF621r.js → photo-capture-CVKE0SKx.js} +18 -19
- package/dist/chunks/{photo-capture-BoZF621r.js.map → photo-capture-CVKE0SKx.js.map} +1 -1
- package/dist/chunks/{photo-capture-modal-BLZtHDj1.js → photo-capture-modal-DARmhHUH.js} +26 -26
- package/dist/chunks/{photo-capture-modal-BLZtHDj1.js.map → photo-capture-modal-DARmhHUH.js.map} +1 -1
- package/dist/chunks/{provider-Btl6Lnki.js → provider-CBSBzOfP.js} +9 -10
- package/dist/chunks/{provider-Btl6Lnki.js.map → provider-CBSBzOfP.js.map} +1 -1
- package/dist/chunks/rdf-form-BeuzVBOP.js +339 -0
- package/dist/chunks/rdf-form-BeuzVBOP.js.map +1 -0
- package/dist/chunks/rdf-input-n73oeSkf.js +440 -0
- package/dist/chunks/rdf-input-n73oeSkf.js.map +1 -0
- package/dist/chunks/{rolldown-runtime-B1bRi_D7.js → rolldown-runtime-Cb76FRpK.js} +2 -2
- package/dist/chunks/{select-XkieYvDm.js → select-BuIxSm1A.js} +9 -10
- package/dist/chunks/{select-XkieYvDm.js.map → select-BuIxSm1A.js.map} +1 -1
- package/dist/chunks/{select-option-DUg4AWzw.js → select-option-Z8qZsCQo.js} +6 -7
- package/dist/chunks/{select-option-DUg4AWzw.js.map → select-option-Z8qZsCQo.js.map} +1 -1
- package/dist/chunks/{signup-button-D5wS8_gB.js → signup-button-B-AgjjAK.js} +8 -9
- package/dist/chunks/{signup-button-D5wS8_gB.js.map → signup-button-B-AgjjAK.js.map} +1 -1
- package/dist/chunks/{solid-emblem-XHk-oomv.js → solid-emblem-D4ItOckU.js} +2 -3
- package/dist/chunks/{solid-emblem-XHk-oomv.js.map → solid-emblem-D4ItOckU.js.map} +1 -1
- package/dist/chunks/{src-CJICzMIV.js → src-B5SL8UtS.js} +2741 -3207
- package/dist/chunks/src-B5SL8UtS.js.map +1 -0
- package/dist/chunks/style-CjYxsW7j.js +536 -0
- package/dist/chunks/style-CjYxsW7j.js.map +1 -0
- package/dist/components/account/Account.cjs.js.map +1 -1
- package/dist/components/account.js +1 -1
- package/dist/components/all.cjs.js +1 -1
- package/dist/components/all.esm.js +2 -1
- package/dist/components/avatar/Avatar.cjs.js.map +1 -1
- package/dist/components/avatar.js +1 -1
- package/dist/components/button/Button.cjs.js +1 -1
- package/dist/components/button/Button.cjs.js.map +1 -1
- package/dist/components/button/Button.esm.js +1 -3
- package/dist/components/button/Button.esm.js.map +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/combobox/Combobox.cjs.js +2 -2
- package/dist/components/combobox/Combobox.cjs.js.map +1 -1
- package/dist/components/combobox/Combobox.d.ts +1 -0
- package/dist/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.esm.js +61 -47
- package/dist/components/combobox/Combobox.esm.js.map +1 -1
- package/dist/components/combobox-option/ComboboxOption.cjs.js.map +1 -1
- package/dist/components/combobox-option.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/dialog/Dialog.cjs.js +4 -4
- package/dist/components/dialog/Dialog.cjs.js.map +1 -1
- package/dist/components/dialog/Dialog.esm.js +5 -4
- package/dist/components/dialog/Dialog.esm.js.map +1 -1
- package/dist/components/dialog-content.js +1 -1
- package/dist/components/dialog-footer.js +1 -1
- package/dist/components/dialog-header.js +1 -1
- package/dist/components/dialog-provider/DialogProvider.cjs.js.map +1 -1
- package/dist/components/dialog-provider.js +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/dialogs-root/DialogsRoot.cjs.js.map +1 -1
- package/dist/components/dialogs-root.js +1 -1
- package/dist/components/guard/Guard.cjs.js.map +1 -1
- package/dist/components/guard.js +1 -1
- package/dist/components/input/Input.cjs.js +3 -2
- package/dist/components/input/Input.cjs.js.map +1 -1
- package/dist/components/input/Input.d.ts +3 -0
- package/dist/components/input/Input.d.ts.map +1 -1
- package/dist/components/input/Input.esm.js +99 -53
- package/dist/components/input/Input.esm.js.map +1 -1
- package/dist/components/input/Input.styles.cjs.js +1 -1
- package/dist/components/input/Input.styles.cjs.js.map +1 -1
- package/dist/components/input/Input.styles.esm.js +1 -1
- package/dist/components/input/Input.styles.esm.js.map +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/login-button/LoginButton.cjs.js.map +1 -1
- package/dist/components/login-button.js +1 -1
- package/dist/components/login-modal/LoginModal.cjs.js.map +1 -1
- package/dist/components/login-modal.js +1 -1
- package/dist/components/logout-button/LogoutButton.cjs.js.map +1 -1
- package/dist/components/logout-button.js +1 -1
- package/dist/components/menu/Menu.cjs.js +1 -1
- package/dist/components/menu/Menu.cjs.js.map +1 -1
- package/dist/components/menu/Menu.d.ts.map +1 -1
- package/dist/components/menu/Menu.esm.js +1 -1
- package/dist/components/menu/Menu.esm.js.map +1 -1
- package/dist/components/menu/Menu.test.d.ts +1 -0
- package/dist/components/menu/Menu.test.d.ts.map +1 -0
- package/dist/components/menu-item/MenuItem.cjs.js.map +1 -1
- package/dist/components/menu-item.js +1 -1
- package/dist/components/menu.js +1 -1
- package/dist/components/photo-capture/PhotoCapture.cjs.js.map +1 -1
- package/dist/components/photo-capture-modal/PhotoCaptureModal.cjs.js +1 -1
- package/dist/components/photo-capture-modal/PhotoCaptureModal.cjs.js.map +1 -1
- package/dist/components/photo-capture-modal/PhotoCaptureModal.esm.js +2 -1
- package/dist/components/photo-capture-modal/PhotoCaptureModal.esm.js.map +1 -1
- package/dist/components/photo-capture-modal.js +1 -1
- package/dist/components/photo-capture.js +1 -1
- package/dist/components/provider/Provider.cjs.js.map +1 -1
- package/dist/components/provider.js +1 -1
- package/dist/components/rdf-form/RDFForm.cjs.js +12 -0
- package/dist/components/rdf-form/RDFForm.cjs.js.map +1 -0
- package/dist/components/rdf-form/RDFForm.d.ts +17 -0
- package/dist/components/rdf-form/RDFForm.d.ts.map +1 -0
- package/dist/components/rdf-form/RDFForm.esm.js +344 -0
- package/dist/components/rdf-form/RDFForm.esm.js.map +1 -0
- package/dist/components/rdf-form/RDForm.stories.d.ts +20 -0
- package/dist/components/rdf-form/RDForm.stories.d.ts.map +1 -0
- package/dist/components/rdf-form/index.cjs.js +2 -0
- package/dist/components/rdf-form/index.cjs.js.map +1 -0
- package/dist/components/rdf-form/index.d.ts +4 -0
- package/dist/components/rdf-form/index.d.ts.map +1 -0
- package/dist/components/rdf-form/index.esm.js +7 -0
- package/dist/components/rdf-form/index.esm.js.map +1 -0
- package/dist/components/rdf-form.js +2 -0
- package/dist/components/rdf-input/RDFInput.cjs.js +11 -0
- package/dist/components/rdf-input/RDFInput.cjs.js.map +1 -0
- package/dist/components/rdf-input/RDFInput.d.ts +24 -0
- package/dist/components/rdf-input/RDFInput.d.ts.map +1 -0
- package/dist/components/rdf-input/RDFInput.esm.js +349 -0
- package/dist/components/rdf-input/RDFInput.esm.js.map +1 -0
- package/dist/components/rdf-input/index.cjs.js +2 -0
- package/dist/components/rdf-input/index.cjs.js.map +1 -0
- package/dist/components/rdf-input/index.d.ts +4 -0
- package/dist/components/rdf-input/index.d.ts.map +1 -0
- package/dist/components/rdf-input/index.esm.js +7 -0
- package/dist/components/rdf-input/index.esm.js.map +1 -0
- package/dist/components/rdf-input.js +2 -0
- package/dist/components/select/Select.cjs.js.map +1 -1
- package/dist/components/select-option/SelectOption.cjs.js.map +1 -1
- package/dist/components/select-option.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/signup-button/SignupButton.cjs.js.map +1 -1
- package/dist/components/signup-button.js +1 -1
- package/dist/components/solid-emblem.js +1 -1
- package/dist/components.js +26 -25
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +3 -2
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +8 -7
- package/dist/lib/auth/SolidAuth.cjs.js +1 -1
- package/dist/lib/auth/SolidAuth.cjs.js.map +1 -1
- package/dist/lib/auth/SolidAuth.esm.js +3 -1
- package/dist/lib/auth/SolidAuth.esm.js.map +1 -1
- package/dist/lib/auth/context.cjs.js.map +1 -1
- package/dist/lib/components/dialog-component/DialogComponent.cjs.js.map +1 -1
- package/dist/lib/components/form-control-component/FormControlComponent.cjs.js.map +1 -1
- package/dist/lib/components/web-component/WebComponent.cjs.js +1 -1
- package/dist/lib/components/web-component/WebComponent.cjs.js.map +1 -1
- package/dist/lib/components/web-component/WebComponent.esm.js +2 -1
- package/dist/lib/components/web-component/WebComponent.esm.js.map +1 -1
- package/dist/lib/dialogs/context.cjs.js.map +1 -1
- package/dist/lib/file-explorer/context.cjs.js +2 -0
- package/dist/lib/file-explorer/context.cjs.js.map +1 -0
- package/dist/lib/file-explorer/context.d.ts +22 -0
- package/dist/lib/file-explorer/context.d.ts.map +1 -0
- package/dist/lib/file-explorer/context.esm.js +7 -0
- package/dist/lib/file-explorer/context.esm.js.map +1 -0
- package/dist/lib/forms/fieldParams.cjs.js +2 -0
- package/dist/lib/forms/fieldParams.cjs.js.map +1 -0
- package/dist/lib/forms/fieldParams.d.ts +21 -0
- package/dist/lib/forms/fieldParams.d.ts.map +1 -0
- package/dist/lib/forms/fieldParams.esm.js +74 -0
- package/dist/lib/forms/fieldParams.esm.js.map +1 -0
- package/dist/lib/forms/rdfFormsHelper.cjs.js +2 -0
- package/dist/lib/forms/rdfFormsHelper.cjs.js.map +1 -0
- package/dist/lib/forms/rdfFormsHelper.d.ts +16 -0
- package/dist/lib/forms/rdfFormsHelper.d.ts.map +1 -0
- package/dist/lib/forms/rdfFormsHelper.esm.js +34 -0
- package/dist/lib/forms/rdfFormsHelper.esm.js.map +1 -0
- package/dist/lib/forms/store/NoopStore.cjs.js +2 -0
- package/dist/lib/forms/store/NoopStore.cjs.js.map +1 -0
- package/dist/lib/forms/store/NoopStore.d.ts +6 -0
- package/dist/lib/forms/store/NoopStore.d.ts.map +1 -0
- package/dist/lib/forms/store/NoopStore.esm.js +10 -0
- package/dist/lib/forms/store/NoopStore.esm.js.map +1 -0
- package/dist/lib/forms/store/StoreContext.cjs.js +2 -0
- package/dist/lib/forms/store/StoreContext.cjs.js.map +1 -0
- package/dist/lib/forms/store/StoreContext.d.ts +10 -0
- package/dist/lib/forms/store/StoreContext.d.ts.map +1 -0
- package/dist/lib/forms/store/StoreContext.esm.js +8 -0
- package/dist/lib/forms/store/StoreContext.esm.js.map +1 -0
- package/dist/lib/ns.cjs.js.map +1 -1
- package/dist/lib/pad.cjs.js +1 -1
- package/dist/lib/pad.cjs.js.map +1 -1
- package/dist/lib/pad.esm.js +6 -5
- package/dist/lib/pad.esm.js.map +1 -1
- package/dist/lib/participation.cjs.js +1 -1
- package/dist/lib/participation.cjs.js.map +1 -1
- package/dist/lib/participation.esm.js +4 -2
- package/dist/lib/participation.esm.js.map +1 -1
- package/dist/lib/preferences.cjs.js +1 -1
- package/dist/lib/preferences.cjs.js.map +1 -1
- package/dist/lib/preferences.esm.js +9 -7
- package/dist/lib/preferences.esm.js.map +1 -1
- package/dist/lib/table.cjs.js +2 -2
- package/dist/lib/table.cjs.js.map +1 -1
- package/dist/lib/table.esm.js +2 -2
- package/dist/lib/table.esm.js.map +1 -1
- package/dist/loader.js +8 -7
- package/dist/login/login.cjs.js.map +1 -1
- package/dist/media/media-capture.esm.js +2 -1
- package/dist/media/media-capture.esm.js.map +1 -1
- package/dist/solid-ui.js +107 -156
- package/dist/solid-ui.min.js +107 -156
- package/dist/solid-ui.min.js.map +1 -1
- package/dist/storybook/components/StorybookProvider.d.ts +1 -0
- package/dist/storybook/components/StorybookProvider.d.ts.map +1 -1
- package/dist/storybook/store/StorybookStore.d.ts +6 -0
- package/dist/storybook/store/StorybookStore.d.ts.map +1 -0
- package/dist/utils/headerFooterHelpers.cjs.js +1 -1
- package/dist/utils/headerFooterHelpers.cjs.js.map +1 -1
- package/dist/utils/headerFooterHelpers.esm.js +2 -1
- package/dist/utils/headerFooterHelpers.esm.js.map +1 -1
- package/dist/utils/index.cjs.js +1 -1
- package/dist/utils/index.cjs.js.map +1 -1
- package/dist/utils/index.esm.js +1 -1
- package/dist/utils/index.esm.js.map +1 -1
- package/dist/utils/keyHelpers/accessData.cjs.js +1 -1
- package/dist/utils/keyHelpers/accessData.cjs.js.map +1 -1
- package/dist/utils/keyHelpers/accessData.d.ts +3 -3
- package/dist/utils/keyHelpers/accessData.d.ts.map +1 -1
- package/dist/utils/keyHelpers/accessData.esm.js +2 -1
- package/dist/utils/keyHelpers/accessData.esm.js.map +1 -1
- package/dist/utils/keyHelpers/otherHelpers.d.ts +1 -1
- package/dist/utils/keyHelpers/otherHelpers.d.ts.map +1 -1
- package/dist/widgets/buttons.cjs.js +2 -2
- package/dist/widgets/buttons.cjs.js.map +1 -1
- package/dist/widgets/buttons.esm.js +10 -5
- package/dist/widgets/buttons.esm.js.map +1 -1
- package/dist/widgets/dragAndDrop.cjs.js +1 -1
- package/dist/widgets/dragAndDrop.cjs.js.map +1 -1
- package/dist/widgets/dragAndDrop.esm.js +1 -1
- package/dist/widgets/dragAndDrop.esm.js.map +1 -1
- package/dist/widgets/forms/autocomplete/autocompleteBar.esm.js +25 -18
- package/dist/widgets/forms/autocomplete/autocompleteBar.esm.js.map +1 -1
- package/dist/widgets/forms/autocomplete/autocompleteField.cjs.js.map +1 -1
- package/dist/widgets/forms/autocomplete/publicData.cjs.js +1 -1
- package/dist/widgets/forms/autocomplete/publicData.cjs.js.map +1 -1
- package/dist/widgets/forms/autocomplete/publicData.d.ts +3 -3
- package/dist/widgets/forms/autocomplete/publicData.d.ts.map +1 -1
- package/dist/widgets/forms/autocomplete/publicData.esm.js +6 -4
- package/dist/widgets/forms/autocomplete/publicData.esm.js.map +1 -1
- package/dist/widgets/forms/basic.cjs.js +1 -1
- package/dist/widgets/forms/basic.cjs.js.map +1 -1
- package/dist/widgets/forms/basic.esm.js +27 -25
- package/dist/widgets/forms/basic.esm.js.map +1 -1
- package/dist/widgets/forms/formStyle.cjs.js +1 -1
- package/dist/widgets/forms/formStyle.cjs.js.map +1 -1
- package/dist/widgets/forms/formStyle.esm.js +4 -4
- package/dist/widgets/forms/formStyle.esm.js.map +1 -1
- package/dist/widgets/forms.cjs.js +2 -2
- package/dist/widgets/forms.cjs.js.map +1 -1
- package/dist/widgets/forms.esm.js +10 -8
- package/dist/widgets/forms.esm.js.map +1 -1
- package/dist/widgets/multiSelect.cjs.js +1 -1
- package/dist/widgets/multiSelect.cjs.js.map +1 -1
- package/dist/widgets/multiSelect.esm.js +2 -1
- package/dist/widgets/multiSelect.esm.js.map +1 -1
- package/dist/widgets/peoplePicker.cjs.js.map +1 -1
- package/package.json +4 -3
- package/dist/chunks/auth-Knq99zZ9.js.map +0 -1
- package/dist/chunks/chunk.7MPIABXH-DNcYOuE8.js.map +0 -1
- package/dist/chunks/combobox-B5j4LoHY.js.map +0 -1
- package/dist/chunks/components-BD458q30.js +0 -758
- package/dist/chunks/components-BD458q30.js.map +0 -1
- package/dist/chunks/footer-BLSjn5ur.js +0 -144
- package/dist/chunks/footer-BLSjn5ur.js.map +0 -1
- package/dist/chunks/headerFooterHelpers-CPd5d20q.js +0 -52
- package/dist/chunks/headerFooterHelpers-CPd5d20q.js.map +0 -1
- package/dist/chunks/input-CCpEhtqA.js.map +0 -1
- package/dist/chunks/lit-C4H1jI4q.js +0 -527
- package/dist/chunks/lit-C4H1jI4q.js.map +0 -1
- package/dist/chunks/menu-DKxtACGA.js.map +0 -1
- package/dist/chunks/solid-logic.esm-BrMdCG2_.js.map +0 -1
- package/dist/chunks/src-CJICzMIV.js.map +0 -1
- package/dist/components/footer/index.cjs.js +0 -1
- package/dist/components/footer/index.d.ts +0 -2
- package/dist/components/footer/index.d.ts.map +0 -1
- package/dist/components/footer/index.esm.js +0 -3
- package/dist/components/footer.js +0 -2
- package/dist/v2/components/layout/footer/Footer.cjs.js +0 -73
- package/dist/v2/components/layout/footer/Footer.cjs.js.map +0 -1
- package/dist/v2/components/layout/footer/Footer.d.ts +0 -60
- package/dist/v2/components/layout/footer/Footer.d.ts.map +0 -1
- package/dist/v2/components/layout/footer/Footer.esm.js +0 -143
- package/dist/v2/components/layout/footer/Footer.esm.js.map +0 -1
- package/dist/v2/components/layout/footer/Footer.test.d.ts +0 -1
- package/dist/v2/components/layout/footer/Footer.test.d.ts.map +0 -1
- package/dist/v2/components/layout/footer/index.cjs.js +0 -2
- package/dist/v2/components/layout/footer/index.cjs.js.map +0 -1
- package/dist/v2/components/layout/footer/index.d.ts +0 -3
- package/dist/v2/components/layout/footer/index.d.ts.map +0 -1
- package/dist/v2/components/layout/footer/index.esm.js +0 -8
- package/dist/v2/components/layout/footer/index.esm.js.map +0 -1
|
@@ -11,20 +11,20 @@ import { store as d } from "solid-logic";
|
|
|
11
11
|
var f = "Solid ID", p = r.iconBase + "noun_34653_green.svg", m = r.iconBase + "noun_Search_875351.svg", h = r.iconBase + "noun_253504.svg";
|
|
12
12
|
async function g(r, g, _, v, y, b) {
|
|
13
13
|
async function x(e, t) {
|
|
14
|
-
return v.permanent ? (u(
|
|
14
|
+
return v.permanent ? (u(M, !0), u(D, !1), u(O, !1)) : C(), y(e, t);
|
|
15
15
|
}
|
|
16
16
|
async function S(t) {
|
|
17
|
-
let n = await i(r, d,
|
|
17
|
+
let n = await i(r, d, L, e.vcard("url"), void 0, f);
|
|
18
18
|
if (n) return y(g, n);
|
|
19
19
|
}
|
|
20
20
|
function C() {
|
|
21
|
-
|
|
21
|
+
I &&= (L.removeChild(I), void 0);
|
|
22
22
|
}
|
|
23
23
|
async function w() {
|
|
24
|
-
|
|
24
|
+
I = r.createElement("div"), I.setAttribute("style", "display: flex; flex-flow: wrap;"), I.appendChild(await l(r, v, F, x)), I.appendChild(D), I.appendChild(O), I.appendChild(M), I.appendChild(k), L.appendChild(I);
|
|
25
25
|
}
|
|
26
26
|
async function T(e) {
|
|
27
|
-
|
|
27
|
+
I ? (L.removeChild(I), I = void 0) : await w();
|
|
28
28
|
}
|
|
29
29
|
async function E(e) {
|
|
30
30
|
for (let t of e) await y(g, t);
|
|
@@ -33,23 +33,30 @@ async function g(r, g, _, v, y, b) {
|
|
|
33
33
|
D.setAttribute("data-testid", "accept-button");
|
|
34
34
|
let O = o(r);
|
|
35
35
|
O.setAttribute("data-testid", "cancel-button");
|
|
36
|
-
let k = r.createElement("div"), A =
|
|
37
|
-
|
|
38
|
-
let
|
|
39
|
-
|
|
36
|
+
let k = r.createElement("div"), A = v.targetClass ? t(v.targetClass) : "item", j = c(r, k, A, b);
|
|
37
|
+
j.setAttribute("data-testid", "delete-button");
|
|
38
|
+
let M = a(r, h, "Edit", (e) => {
|
|
39
|
+
N = !N, P();
|
|
40
40
|
});
|
|
41
|
-
|
|
42
|
-
let
|
|
43
|
-
function
|
|
44
|
-
|
|
41
|
+
M.setAttribute("data-testid", "edit-button");
|
|
42
|
+
let N = !0;
|
|
43
|
+
function P() {
|
|
44
|
+
N ? (u(M, !1), u(D, !1), u(O, !1)) : (u(M, !0), u(D, !1), u(O, !1));
|
|
45
45
|
}
|
|
46
|
-
let
|
|
46
|
+
let F = {
|
|
47
47
|
acceptButton: D,
|
|
48
48
|
cancelButton: O,
|
|
49
|
-
editButton:
|
|
50
|
-
deleteButton:
|
|
51
|
-
},
|
|
52
|
-
|
|
49
|
+
editButton: M,
|
|
50
|
+
deleteButton: j
|
|
51
|
+
}, I, L = r.createElement("div");
|
|
52
|
+
if (L.style.display = "flex", L.style.flexDirection = "row", (v.permanent || v.currentObject) && await w(), _.editable) {
|
|
53
|
+
if (L.style.width = "100%", _.manualURIEntry) {
|
|
54
|
+
let e = L.appendChild(a(r, p, _.idNoun, S));
|
|
55
|
+
n(e, E, void 0);
|
|
56
|
+
}
|
|
57
|
+
_.dbLookup && !v.currentObject && !v.permanent && L.appendChild(a(r, m, _.idNoun, T));
|
|
58
|
+
}
|
|
59
|
+
return P(), L;
|
|
53
60
|
}
|
|
54
61
|
//#endregion
|
|
55
62
|
export { g as renderAutocompleteControl };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocompleteBar.esm.js","names":[],"sources":["../../../../src/widgets/forms/autocomplete/autocompleteBar.ts"],"sourcesContent":["/* The Autocomplete Control with decorations\n\nThis control has the buttons which control the state between editing, viewing, searching, accepting\nand so on. See the state diagram in the documentation. The AUtocomplete Picker does the main work.\n\n*/\nimport ns from '../../../lib/ns'\nimport { icons } from '../../../lib/iconBase'\nimport { store } from 'solid-logic'\nimport * as widgets from '../../../widgets'\nimport * as utils from '../../../utils'\n\nimport { renderAutoComplete, AutocompleteDecoration, setVisible } from './autocompletePicker' // dbpediaParameters\n\nimport { NamedNode } from 'rdflib'\n\nconst WEBID_NOUN = 'Solid ID'\n\nconst GREEN_PLUS = icons.iconBase + 'noun_34653_green.svg'\nconst SEARCH_ICON = icons.iconBase + 'noun_Search_875351.svg'\nconst EDIT_ICON = icons.iconBase + 'noun_253504.svg'\n// const DELETE_ICON = icons.iconBase + 'noun_2188_red.svg'\n\nexport async function renderAutocompleteControl (dom:HTMLDocument,\n person:NamedNode,\n barOptions,\n acOptions,\n addOneIdAndRefresh,\n deleteOne): Promise<HTMLElement> {\n async function autoCompleteDone (object, name) {\n if (acOptions.permanent) { // remember to set this in publicid panel\n setVisible(editButton, true)\n setVisible(acceptButton, false)\n setVisible(cancelButton, false)\n } else {\n // console.log('temporary - removed decoratiion')\n removeDecorated()\n }\n return addOneIdAndRefresh(object, name)\n }\n\n async function greenButtonHandler (_event) {\n const webid = await widgets.askName(dom, store, creationArea, ns.vcard('url'), undefined, WEBID_NOUN)\n if (!webid) {\n return // cancelled by user\n }\n return addOneIdAndRefresh(person, webid)\n }\n\n function removeDecorated () {\n if (decoratedAutocomplete) {\n creationArea.removeChild(decoratedAutocomplete)\n decoratedAutocomplete = undefined\n }\n }\n\n async function displayAutocomplete () {\n decoratedAutocomplete = dom.createElement('div') as HTMLElement\n decoratedAutocomplete.setAttribute('style', 'display: flex; flex-flow: wrap;')\n decoratedAutocomplete.appendChild(await renderAutoComplete(dom, acOptions, decoration, autoCompleteDone))\n // console.log('@@ acceptButton', acceptButton)\n decoratedAutocomplete.appendChild(acceptButton)\n // console.log('@@ cancelButton', cancelButton)\n\n decoratedAutocomplete.appendChild(cancelButton)\n // console.log('@@ editButton', editButton)\n\n decoratedAutocomplete.appendChild(editButton)\n // console.log('@@ deleteButtonContainer', deleteButtonContainer)\n\n decoratedAutocomplete.appendChild(deleteButtonContainer)\n creationArea.appendChild(decoratedAutocomplete)\n }\n\n async function searchButtonHandler (_event) {\n if (decoratedAutocomplete) {\n creationArea.removeChild(decoratedAutocomplete)\n decoratedAutocomplete = undefined\n } else {\n await displayAutocomplete()\n }\n }\n\n async function droppedURIHandler (uris) {\n for (const webid of uris) { // normally one but can be more than one\n await addOneIdAndRefresh(person, webid)\n }\n }\n\n const acceptButton = widgets.continueButton(dom)\n acceptButton.setAttribute('data-testid', 'accept-button')\n\n const cancelButton = widgets.cancelButton(dom)\n cancelButton.setAttribute('data-testid', 'cancel-button')\n const deleteButtonContainer = dom.createElement('div')\n const noun = acOptions.targetClass ? utils.label(acOptions.targetClass) : 'item'\n const deleteButton = widgets.deleteButtonWithCheck(dom, deleteButtonContainer, noun, deleteOne) // need to knock out this UI or caller does that\n deleteButton.setAttribute('data-testid', 'delete-button')\n const editButton = widgets.button(dom, EDIT_ICON, 'Edit', _event => {\n editing = !editing\n syncEditingStatus()\n })\n editButton.setAttribute('data-testid', 'edit-button')\n let editing = true\n\n function syncEditingStatus () {\n if (editing) {\n setVisible(editButton, false)\n setVisible(acceptButton, false) // not till got it\n setVisible(cancelButton, false)\n } else {\n setVisible(editButton, true)\n setVisible(acceptButton, false)\n setVisible(cancelButton, false)\n }\n }\n\n const decoration:AutocompleteDecoration = {\n acceptButton, cancelButton, editButton, deleteButton\n }\n\n let decoratedAutocomplete = undefined as HTMLElement | undefined\n\n const creationArea = dom.createElement('div')\n creationArea.style.display = 'flex'\n creationArea.style.flexDirection = 'row'\n\n if (acOptions.permanent || acOptions.currentObject) {\n await displayAutocomplete()\n }\n if (barOptions.editable) {\n // creationArea.appendChild(await renderAutoComplete(dom, barOptions, autoCompleteDone)) wait for searchButton\n creationArea.style.width = '100%'\n if (barOptions.manualURIEntry) {\n const plus = creationArea.appendChild(widgets.button(dom, GREEN_PLUS, barOptions.idNoun, greenButtonHandler))\n widgets.makeDropTarget(plus, droppedURIHandler, undefined)\n }\n if (barOptions.dbLookup && !acOptions.currentObject && !acOptions.permanent) {\n creationArea.appendChild(widgets.button(dom, SEARCH_ICON, barOptions.idNoun, searchButtonHandler))\n }\n }\n syncEditingStatus()\n return creationArea\n} // renderAutocompleteControl\n\n// ends\n"],"mappings":";;;;;;;;;;AAgBA,IAAM,IAAa,YAEb,IAAa,EAAM,WAAW,wBAC9B,IAAc,EAAM,WAAW,0BAC/B,IAAY,EAAM,WAAW;AAGnC,eAAsB,EAA2B,GAC/C,GACA,GACA,GACA,GACA,GAAiC;CACjC,eAAe,EAAkB,GAAQ,GAAM;EAS7C,OARI,EAAU,aACZ,EAAW,GAAY,EAAI,GAC3B,EAAW,GAAc,EAAK,GAC9B,EAAW,GAAc,EAAK,KAG9B,EAAgB,GAEX,EAAmB,GAAQ,CAAI;CACxC;CAEA,eAAe,EAAoB,GAAQ;EACzC,IAAM,IAAQ,MAAM,EAAgB,GAAK,GAAO,GAAc,EAAG,MAAM,KAAK,GAAG,KAAA,GAAW,CAAU;EAC/F,OAGL,OAAO,EAAmB,GAAQ,CAAK;CACzC;CAEA,SAAS,IAAmB;EAC1B,AAEE,OADA,EAAa,YAAY,CAAqB,GACtB,KAAA;CAE5B;CAEA,eAAe,IAAuB;EAepC,AAdA,IAAwB,EAAI,cAAc,KAAK,GAC/C,EAAsB,aAAa,SAAS,iCAAiC,GAC7E,EAAsB,YAAY,MAAM,EAAmB,GAAK,GAAW,GAAY,CAAgB,CAAC,GAExG,EAAsB,YAAY,CAAY,GAG9C,EAAsB,YAAY,CAAY,GAG9C,EAAsB,YAAY,CAAU,GAG5C,EAAsB,YAAY,CAAqB,GACvD,EAAa,YAAY,CAAqB;CAChD;CAEA,eAAe,EAAqB,GAAQ;EAC1C,AAAI,KACF,EAAa,YAAY,CAAqB,GAC9C,IAAwB,KAAA,KAExB,MAAM,EAAoB;CAE9B;CAEA,eAAe,EAAmB,GAAM;EACtC,KAAK,IAAM,KAAS,GAClB,MAAM,EAAmB,GAAQ,CAAK;CAE1C;CAEA,IAAM,IAAe,EAAuB,CAAG;CAC/C,EAAa,aAAa,eAAe,eAAe;CAExD,IAAM,IAAe,EAAqB,CAAG;CAC7C,EAAa,aAAa,eAAe,eAAe;CACxD,IAAM,IAAwB,EAAI,cAAc,KAAK,
|
|
1
|
+
{"version":3,"file":"autocompleteBar.esm.js","names":[],"sources":["../../../../src/widgets/forms/autocomplete/autocompleteBar.ts"],"sourcesContent":["/* The Autocomplete Control with decorations\n\nThis control has the buttons which control the state between editing, viewing, searching, accepting\nand so on. See the state diagram in the documentation. The AUtocomplete Picker does the main work.\n\n*/\nimport ns from '../../../lib/ns'\nimport { icons } from '../../../lib/iconBase'\nimport { store } from 'solid-logic'\nimport * as widgets from '../../../widgets'\nimport * as utils from '../../../utils'\n\nimport { renderAutoComplete, AutocompleteDecoration, setVisible } from './autocompletePicker' // dbpediaParameters\n\nimport { NamedNode } from 'rdflib'\n\nconst WEBID_NOUN = 'Solid ID'\n\nconst GREEN_PLUS = icons.iconBase + 'noun_34653_green.svg'\nconst SEARCH_ICON = icons.iconBase + 'noun_Search_875351.svg'\nconst EDIT_ICON = icons.iconBase + 'noun_253504.svg'\n// const DELETE_ICON = icons.iconBase + 'noun_2188_red.svg'\n\nexport async function renderAutocompleteControl (dom:HTMLDocument,\n person:NamedNode,\n barOptions,\n acOptions,\n addOneIdAndRefresh,\n deleteOne): Promise<HTMLElement> {\n async function autoCompleteDone (object, name) {\n if (acOptions.permanent) { // remember to set this in publicid panel\n setVisible(editButton, true)\n setVisible(acceptButton, false)\n setVisible(cancelButton, false)\n } else {\n // console.log('temporary - removed decoratiion')\n removeDecorated()\n }\n return addOneIdAndRefresh(object, name)\n }\n\n async function greenButtonHandler (_event) {\n const webid = await widgets.askName(dom, store, creationArea, ns.vcard('url'), undefined, WEBID_NOUN)\n if (!webid) {\n return // cancelled by user\n }\n return addOneIdAndRefresh(person, webid)\n }\n\n function removeDecorated () {\n if (decoratedAutocomplete) {\n creationArea.removeChild(decoratedAutocomplete)\n decoratedAutocomplete = undefined\n }\n }\n\n async function displayAutocomplete () {\n decoratedAutocomplete = dom.createElement('div') as HTMLElement\n decoratedAutocomplete.setAttribute('style', 'display: flex; flex-flow: wrap;')\n decoratedAutocomplete.appendChild(await renderAutoComplete(dom, acOptions, decoration, autoCompleteDone))\n // console.log('@@ acceptButton', acceptButton)\n decoratedAutocomplete.appendChild(acceptButton)\n // console.log('@@ cancelButton', cancelButton)\n\n decoratedAutocomplete.appendChild(cancelButton)\n // console.log('@@ editButton', editButton)\n\n decoratedAutocomplete.appendChild(editButton)\n // console.log('@@ deleteButtonContainer', deleteButtonContainer)\n\n decoratedAutocomplete.appendChild(deleteButtonContainer)\n creationArea.appendChild(decoratedAutocomplete)\n }\n\n async function searchButtonHandler (_event) {\n if (decoratedAutocomplete) {\n creationArea.removeChild(decoratedAutocomplete)\n decoratedAutocomplete = undefined\n } else {\n await displayAutocomplete()\n }\n }\n\n async function droppedURIHandler (uris) {\n for (const webid of uris) { // normally one but can be more than one\n await addOneIdAndRefresh(person, webid)\n }\n }\n\n const acceptButton = widgets.continueButton(dom)\n acceptButton.setAttribute('data-testid', 'accept-button')\n\n const cancelButton = widgets.cancelButton(dom)\n cancelButton.setAttribute('data-testid', 'cancel-button')\n const deleteButtonContainer = dom.createElement('div')\n const noun = acOptions.targetClass ? utils.label(acOptions.targetClass) : 'item'\n const deleteButton = widgets.deleteButtonWithCheck(dom, deleteButtonContainer, noun, deleteOne) // need to knock out this UI or caller does that\n deleteButton.setAttribute('data-testid', 'delete-button')\n const editButton = widgets.button(dom, EDIT_ICON, 'Edit', _event => {\n editing = !editing\n syncEditingStatus()\n })\n editButton.setAttribute('data-testid', 'edit-button')\n let editing = true\n\n function syncEditingStatus () {\n if (editing) {\n setVisible(editButton, false)\n setVisible(acceptButton, false) // not till got it\n setVisible(cancelButton, false)\n } else {\n setVisible(editButton, true)\n setVisible(acceptButton, false)\n setVisible(cancelButton, false)\n }\n }\n\n const decoration:AutocompleteDecoration = {\n acceptButton, cancelButton, editButton, deleteButton\n }\n\n let decoratedAutocomplete = undefined as HTMLElement | undefined\n\n const creationArea = dom.createElement('div')\n creationArea.style.display = 'flex'\n creationArea.style.flexDirection = 'row'\n\n if (acOptions.permanent || acOptions.currentObject) {\n await displayAutocomplete()\n }\n if (barOptions.editable) {\n // creationArea.appendChild(await renderAutoComplete(dom, barOptions, autoCompleteDone)) wait for searchButton\n creationArea.style.width = '100%'\n if (barOptions.manualURIEntry) {\n const plus = creationArea.appendChild(widgets.button(dom, GREEN_PLUS, barOptions.idNoun, greenButtonHandler))\n widgets.makeDropTarget(plus, droppedURIHandler, undefined)\n }\n if (barOptions.dbLookup && !acOptions.currentObject && !acOptions.permanent) {\n creationArea.appendChild(widgets.button(dom, SEARCH_ICON, barOptions.idNoun, searchButtonHandler))\n }\n }\n syncEditingStatus()\n return creationArea\n} // renderAutocompleteControl\n\n// ends\n"],"mappings":";;;;;;;;;;AAgBA,IAAM,IAAa,YAEb,IAAa,EAAM,WAAW,wBAC9B,IAAc,EAAM,WAAW,0BAC/B,IAAY,EAAM,WAAW;AAGnC,eAAsB,EAA2B,GAC/C,GACA,GACA,GACA,GACA,GAAiC;CACjC,eAAe,EAAkB,GAAQ,GAAM;EAS7C,OARI,EAAU,aACZ,EAAW,GAAY,EAAI,GAC3B,EAAW,GAAc,EAAK,GAC9B,EAAW,GAAc,EAAK,KAG9B,EAAgB,GAEX,EAAmB,GAAQ,CAAI;CACxC;CAEA,eAAe,EAAoB,GAAQ;EACzC,IAAM,IAAQ,MAAM,EAAgB,GAAK,GAAO,GAAc,EAAG,MAAM,KAAK,GAAG,KAAA,GAAW,CAAU;EAC/F,OAGL,OAAO,EAAmB,GAAQ,CAAK;CACzC;CAEA,SAAS,IAAmB;EAC1B,AAEE,OADA,EAAa,YAAY,CAAqB,GACtB,KAAA;CAE5B;CAEA,eAAe,IAAuB;EAepC,AAdA,IAAwB,EAAI,cAAc,KAAK,GAC/C,EAAsB,aAAa,SAAS,iCAAiC,GAC7E,EAAsB,YAAY,MAAM,EAAmB,GAAK,GAAW,GAAY,CAAgB,CAAC,GAExG,EAAsB,YAAY,CAAY,GAG9C,EAAsB,YAAY,CAAY,GAG9C,EAAsB,YAAY,CAAU,GAG5C,EAAsB,YAAY,CAAqB,GACvD,EAAa,YAAY,CAAqB;CAChD;CAEA,eAAe,EAAqB,GAAQ;EAC1C,AAAI,KACF,EAAa,YAAY,CAAqB,GAC9C,IAAwB,KAAA,KAExB,MAAM,EAAoB;CAE9B;CAEA,eAAe,EAAmB,GAAM;EACtC,KAAK,IAAM,KAAS,GAClB,MAAM,EAAmB,GAAQ,CAAK;CAE1C;CAEA,IAAM,IAAe,EAAuB,CAAG;CAC/C,EAAa,aAAa,eAAe,eAAe;CAExD,IAAM,IAAe,EAAqB,CAAG;CAC7C,EAAa,aAAa,eAAe,eAAe;CACxD,IAAM,IAAwB,EAAI,cAAc,KAAK,GAC/C,IAAO,EAAU,cAAc,EAAY,EAAU,WAAW,IAAI,QACpE,IAAe,EAA8B,GAAK,GAAuB,GAAM,CAAS;CAC9F,EAAa,aAAa,eAAe,eAAe;CACxD,IAAM,IAAa,EAAe,GAAK,GAAW,SAAQ,MAAU;EAElE,AADA,IAAU,CAAC,GACX,EAAkB;CACpB,CAAC;CACD,EAAW,aAAa,eAAe,aAAa;CACpD,IAAI,IAAU;CAEd,SAAS,IAAqB;EAC5B,AAAI,KACF,EAAW,GAAY,EAAK,GAC5B,EAAW,GAAc,EAAK,GAC9B,EAAW,GAAc,EAAK,MAE9B,EAAW,GAAY,EAAI,GAC3B,EAAW,GAAc,EAAK,GAC9B,EAAW,GAAc,EAAK;CAElC;CAEA,IAAM,IAAoC;EACxC;EAAc,cAAA;EAAc;EAAY;CAC1C,GAEI,GAEE,IAAe,EAAI,cAAc,KAAK;CAO5C,IANA,EAAa,MAAM,UAAU,QAC7B,EAAa,MAAM,gBAAgB,QAE/B,EAAU,aAAa,EAAU,kBACnC,MAAM,EAAoB,GAExB,EAAW,UAAU;EAGvB,IADA,EAAa,MAAM,QAAQ,QACvB,EAAW,gBAAgB;GAC7B,IAAM,IAAO,EAAa,YAAY,EAAe,GAAK,GAAY,EAAW,QAAQ,CAAkB,CAAC;GAC5G,EAAuB,GAAM,GAAmB,KAAA,CAAS;EAC3D;EACA,AAAI,EAAW,YAAY,CAAC,EAAU,iBAAiB,CAAC,EAAU,aAChE,EAAa,YAAY,EAAe,GAAK,GAAa,EAAW,QAAQ,CAAmB,CAAC;CAErG;CAEA,OADA,EAAkB,GACX;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocompleteField.cjs.js","names":[],"sources":["../../../../src/widgets/forms/autocomplete/autocompleteField.ts"],"sourcesContent":["/* Form field for doing autocompleete\n */\nimport ns from '../../../lib/ns'\nimport { store } from 'solid-logic'\nimport * as widgets from '../../../widgets'\nimport { style } from '../../../lib/style'\nimport { renderAutocompleteControl } from './autocompleteBar'\nimport { QueryParameters } from './publicData'\nimport { NamedNode, BlankNode, Literal, Variable, st } from 'rdflib'\nimport { AutocompleteOptions } from './autocompletePicker'\n/**\n * Render a autocomplete form field\n *\n * The autocomplete form searches for an object in a definitive public database,\n * and allows the user to search for it by name, displaying a list of objects whose names match\n * the input to date, and letting the user either click on one of the list,\n * or just go on untill there is only one. The process then returns two values,\n * the URiI of the object and its name.\n *\n * @param dom The HTML Document object aka Document Object Model\n * @param container If present, the created widget will be appended to this\n * @param already A hash table of (form, subject) kept to prevent recursive forms looping\n * @param subject The thing about which the form displays/edits data\n * @param form The form or field to be rendered\n * @param doc The web document in which the data is\n * @param callbackFunction Called when data is changed so other parts can be refreshed.\n *\n * Form properties:\n * @param ui:property The property to store the object itself\n * @param ui:labelProperty The property used to store the name of the object\n * @param ui:category The class of objects to be searched, if fixed (else dep on class of subject)\n *\n * @returns The HTML widget created\n */\n\nexport function autocompleteField (\n dom: HTMLDocument,\n container: HTMLElement | undefined,\n already,\n subject: NamedNode | BlankNode | Variable,\n form: NamedNode,\n doc: NamedNode | undefined,\n callbackFunction: (_ok: boolean, _errorMessage: string) => void\n): HTMLElement {\n async function addOneIdAndRefresh (result:NamedNode | Literal, name: Literal) {\n if (!name) {\n throw new Error('autocompleteField: No name set.')\n }\n const oldValue = kb.the(subject, property as any, null, doc)\n if (oldValue) {\n const oldName = kb.any(oldValue as any, labelProperty as any, null, doc)\n if (oldValue.equals(result) && oldName && oldName.sameTerm(name)) {\n // console.log('No change: same values.')\n return\n }\n }\n const deletables = oldValue\n ? kb.statementsMatching(subject, property as any, oldValue, doc)\n .concat(kb.statementsMatching(oldValue as any, labelProperty as any, null, doc))\n : []\n // console.log('autocompleteField Deletables ' + deletables.map(st => st.toNT()))\n const insertables = [st(subject, property as any, result, doc),\n st(result as any, labelProperty as any, name, doc)] // @@ track the language of the name too!\n // console.log(`AC form: ${deletables.length} to delete and ${insertables.length} to insert`)\n try {\n // console.log('@@@ AC updating ', deletables, insertables)\n await kb.updater?.updateMany(deletables, insertables)\n } catch (err) {\n callbackFunction(false, err)\n box.appendChild(widgets.errorMessageBlock(dom, 'Autocomplete form data update error:' + err, null, err))\n return\n }\n callbackFunction(true, '')\n }\n\n async function deleteOne (_result:NamedNode | Literal, _name: Literal) {\n const oldValue = kb.the(subject, property as any, null, doc)\n if (!oldValue) {\n callbackFunction(false, 'NO data to elete')\n box.appendChild(widgets.errorMessageBlock(dom, 'Autocomplete delete: no old data!'))\n return\n }\n // const oldName = kb.any(oldValue as any, labelProperty as any, null, doc)\n const deletables = kb.statementsMatching(subject, property as any, oldValue, doc)\n .concat(kb.statementsMatching(oldValue as any, labelProperty as any, null, doc))\n // console.log('autocompleteField Deletables ' + deletables.map(st => st.toNT()))\n const insertables = []\n // console.log(`AC form delete: ${deletables.length} to delete and ${insertables.length} to insert`)\n try {\n // console.log('@@@ AC updating ', deletables, insertables)\n await kb.updater?.updateMany(deletables, insertables)\n } catch (err) {\n const e2 = new Error('Autocomplete form data delete error:' + err)\n callbackFunction(false, err)\n box.appendChild(widgets.errorMessageBlock(dom, e2, null, err))\n return\n }\n callbackFunction(true, '') // changed\n }\n\n if (subject.termType !== 'NamedNode') {\n throw new Error('Sorry this field only works on NamedNode subjects (for editable)')\n }\n const kb = store\n const formDoc = form.doc ? form.doc() : null // @@ if blank no way to know\n\n const box = dom.createElement('div')\n if (container) container.appendChild(box)\n const lhs = dom.createElement('div')\n lhs.setAttribute('class', 'formFieldName')\n lhs.setAttribute('style', style.formFieldNameBoxStyle)\n box.appendChild(lhs)\n const rhs = dom.createElement('div')\n rhs.setAttribute('class', 'formFieldValue')\n box.appendChild(rhs)\n\n const property = kb.any(form, ns.ui('property'))\n if (!property) {\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No property given for autocomplete field: ' + form)\n )\n }\n const labelProperty = kb.any(form, ns.ui('labelProperty')) || ns.schema('name')\n\n // Parse the data source into query options\n\n const dataSource = kb.any(form, ns.ui('dataSource')) as NamedNode | undefined\n if (!dataSource) {\n // console.log('@@ connectedStatements ACF ', kb.connectedStatements(form).map(x => x.toNT()).join('\\n'))\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No data source given for autocomplete field: ' + form)\n )\n }\n const queryParams:QueryParameters = {\n // targetClass: kb.any(dataSource, ns.ui('targetClass'), null, dataSource.doc()) as NamedNode | undefined,\n label: kb.anyJS(dataSource, ns.schema('name'), null, dataSource.doc()),\n logo: (kb.any(dataSource, ns.schema('logo'), null, dataSource.doc())) as NamedNode | undefined\n }\n\n // @@ Should we pass the target class in from the data source definition or use a current type of the subject\n const targetClass = (kb.any(form, ns.ui('targetClass'), null, form.doc()) || // class in form takes pecedence\n kb.any(dataSource, ns.ui('targetClass'), null, dataSource.doc())) as NamedNode | undefined\n if (targetClass) {\n queryParams.targetClass = targetClass\n }\n\n queryParams.objectURIBase = (kb.any(dataSource, ns.ui('objectURIBase'), null, dataSource.doc()) || undefined) as NamedNode | undefined\n\n /*\n if (!queryParams.targetClass) {\n const klass = kb.any(subject, ns.rdf('type')) as NamedNode | undefined\n // @@ be more selective of which class if many\n // @@ todo: Take ALL classes, and compare them with those the data source knows about\n // with translation where necessary. Find most specific of the classes for the search.\n if (!klass) throw new Error('Autocomplete: No class specified or is current type of' + subject)\n queryParams.targetClass = klass\n }\n */\n const endpoint = kb.anyJS(dataSource, ns.ui('endpoint'), null, dataSource.doc()) as string | undefined\n if (endpoint) { // SPARQL\n queryParams.endpoint = endpoint\n\n queryParams.searchByNameQuery = kb.anyJS(dataSource, ns.ui('searchByNameQuery'), null, dataSource.doc())\n if (!queryParams.searchByNameQuery) {\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No searchByNameQuery given for endpoint data Source: ' + form))\n }\n queryParams.insitituteDetailsQuery = kb.anyJS(dataSource, ns.ui('insitituteDetailsQuery'), null, dataSource.doc())\n } else {\n // return box.appendChild(\n // widgets.errorMessageBlock(dom, 'Error: No SPARQL endpoint given for autocomplete field: ' + form))\n const searchByNameURI = kb.anyJS(dataSource, ns.ui('searchByNameURI'))\n if (!searchByNameURI) {\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No searchByNameURI OR sparql endpoint given for dataSource: ' + dataSource)\n )\n }\n queryParams.searchByNameURI = searchByNameURI\n }\n // It can be cleaner to just remove empty fields if you can't edit them anyway\n const suppressEmptyUneditable = kb.anyJS(form, ns.ui('suppressEmptyUneditable'), null, formDoc)\n const editable = kb.updater?.editable((doc as NamedNode).uri)\n\n const autocompleteOptions:AutocompleteOptions = { // cancelButton?: HTMLElement,\n permanent: true,\n targetClass: queryParams.targetClass, // @@ simplify?\n queryParams\n }\n\n autocompleteOptions.size = kb.anyJS(form, ns.ui('size'), null, formDoc) || undefined\n\n let obj = kb.any(subject, property as any, undefined, doc)\n if (!obj) {\n obj = kb.any(form, ns.ui('default'))\n if (obj) {\n autocompleteOptions.currentObject = obj as NamedNode\n autocompleteOptions.currentName = kb.any(autocompleteOptions.currentObject, labelProperty, null, doc) as Literal\n } else { // No data or default. Should we suprress the whole field?\n if (suppressEmptyUneditable && !editable) {\n box.style.display = 'none' // clutter removal\n return box\n }\n }\n } else { // get object and name from target data:\n autocompleteOptions.currentObject = obj as NamedNode\n autocompleteOptions.currentName = kb.any(autocompleteOptions.currentObject, labelProperty, null, doc) as Literal\n }\n\n lhs.appendChild(widgets.fieldLabel(dom, property as any, form))\n\n const barOptions = {\n editable,\n dbLookup: true\n }\n\n renderAutocompleteControl(dom, subject as NamedNode, barOptions, autocompleteOptions, addOneIdAndRefresh, deleteOne).then((control) => {\n rhs.appendChild(control)\n }, (err) => {\n rhs.appendChild(widgets.errorMessageBlock(dom, `Error rendering autocomplete ${form}: ${err}`, '#fee', err)) //\n })\n return box\n}\n\n// ends\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"autocompleteField.cjs.js","names":[],"sources":["../../../../src/widgets/forms/autocomplete/autocompleteField.ts"],"sourcesContent":["/* Form field for doing autocompleete\n */\nimport ns from '../../../lib/ns'\nimport { store } from 'solid-logic'\nimport * as widgets from '../../../widgets'\nimport { style } from '../../../lib/style'\nimport { renderAutocompleteControl } from './autocompleteBar'\nimport { QueryParameters } from './publicData'\nimport { NamedNode, BlankNode, Literal, Variable, st } from 'rdflib'\nimport { AutocompleteOptions } from './autocompletePicker'\n/**\n * Render a autocomplete form field\n *\n * The autocomplete form searches for an object in a definitive public database,\n * and allows the user to search for it by name, displaying a list of objects whose names match\n * the input to date, and letting the user either click on one of the list,\n * or just go on untill there is only one. The process then returns two values,\n * the URiI of the object and its name.\n *\n * @param dom The HTML Document object aka Document Object Model\n * @param container If present, the created widget will be appended to this\n * @param already A hash table of (form, subject) kept to prevent recursive forms looping\n * @param subject The thing about which the form displays/edits data\n * @param form The form or field to be rendered\n * @param doc The web document in which the data is\n * @param callbackFunction Called when data is changed so other parts can be refreshed.\n *\n * Form properties:\n * @param ui:property The property to store the object itself\n * @param ui:labelProperty The property used to store the name of the object\n * @param ui:category The class of objects to be searched, if fixed (else dep on class of subject)\n *\n * @returns The HTML widget created\n */\n\nexport function autocompleteField (\n dom: HTMLDocument,\n container: HTMLElement | undefined,\n already,\n subject: NamedNode | BlankNode | Variable,\n form: NamedNode,\n doc: NamedNode | undefined,\n callbackFunction: (_ok: boolean, _errorMessage: string) => void\n): HTMLElement {\n async function addOneIdAndRefresh (result:NamedNode | Literal, name: Literal) {\n if (!name) {\n throw new Error('autocompleteField: No name set.')\n }\n const oldValue = kb.the(subject, property as any, null, doc)\n if (oldValue) {\n const oldName = kb.any(oldValue as any, labelProperty as any, null, doc)\n if (oldValue.equals(result) && oldName && oldName.sameTerm(name)) {\n // console.log('No change: same values.')\n return\n }\n }\n const deletables = oldValue\n ? kb.statementsMatching(subject, property as any, oldValue, doc)\n .concat(kb.statementsMatching(oldValue as any, labelProperty as any, null, doc))\n : []\n // console.log('autocompleteField Deletables ' + deletables.map(st => st.toNT()))\n const insertables = [st(subject, property as any, result, doc),\n st(result as any, labelProperty as any, name, doc)] // @@ track the language of the name too!\n // console.log(`AC form: ${deletables.length} to delete and ${insertables.length} to insert`)\n try {\n // console.log('@@@ AC updating ', deletables, insertables)\n await kb.updater?.updateMany(deletables, insertables)\n } catch (err) {\n callbackFunction(false, err)\n box.appendChild(widgets.errorMessageBlock(dom, 'Autocomplete form data update error:' + err, null, err))\n return\n }\n callbackFunction(true, '')\n }\n\n async function deleteOne (_result:NamedNode | Literal, _name: Literal) {\n const oldValue = kb.the(subject, property as any, null, doc)\n if (!oldValue) {\n callbackFunction(false, 'NO data to elete')\n box.appendChild(widgets.errorMessageBlock(dom, 'Autocomplete delete: no old data!'))\n return\n }\n // const oldName = kb.any(oldValue as any, labelProperty as any, null, doc)\n const deletables = kb.statementsMatching(subject, property as any, oldValue, doc)\n .concat(kb.statementsMatching(oldValue as any, labelProperty as any, null, doc))\n // console.log('autocompleteField Deletables ' + deletables.map(st => st.toNT()))\n const insertables = []\n // console.log(`AC form delete: ${deletables.length} to delete and ${insertables.length} to insert`)\n try {\n // console.log('@@@ AC updating ', deletables, insertables)\n await kb.updater?.updateMany(deletables, insertables)\n } catch (err) {\n const e2 = new Error('Autocomplete form data delete error:' + err)\n callbackFunction(false, err)\n box.appendChild(widgets.errorMessageBlock(dom, e2, null, err))\n return\n }\n callbackFunction(true, '') // changed\n }\n\n if (subject.termType !== 'NamedNode') {\n throw new Error('Sorry this field only works on NamedNode subjects (for editable)')\n }\n const kb = store\n const formDoc = form.doc ? form.doc() : null // @@ if blank no way to know\n\n const box = dom.createElement('div')\n if (container) container.appendChild(box)\n const lhs = dom.createElement('div')\n lhs.setAttribute('class', 'formFieldName')\n lhs.setAttribute('style', style.formFieldNameBoxStyle)\n box.appendChild(lhs)\n const rhs = dom.createElement('div')\n rhs.setAttribute('class', 'formFieldValue')\n box.appendChild(rhs)\n\n const property = kb.any(form, ns.ui('property'))\n if (!property) {\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No property given for autocomplete field: ' + form)\n )\n }\n const labelProperty = kb.any(form, ns.ui('labelProperty')) || ns.schema('name')\n\n // Parse the data source into query options\n\n const dataSource = kb.any(form, ns.ui('dataSource')) as NamedNode | undefined\n if (!dataSource) {\n // console.log('@@ connectedStatements ACF ', kb.connectedStatements(form).map(x => x.toNT()).join('\\n'))\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No data source given for autocomplete field: ' + form)\n )\n }\n const queryParams:QueryParameters = {\n // targetClass: kb.any(dataSource, ns.ui('targetClass'), null, dataSource.doc()) as NamedNode | undefined,\n label: kb.anyJS(dataSource, ns.schema('name'), null, dataSource.doc()),\n logo: (kb.any(dataSource, ns.schema('logo'), null, dataSource.doc())) as NamedNode | undefined\n }\n\n // @@ Should we pass the target class in from the data source definition or use a current type of the subject\n const targetClass = (kb.any(form, ns.ui('targetClass'), null, form.doc()) || // class in form takes pecedence\n kb.any(dataSource, ns.ui('targetClass'), null, dataSource.doc())) as NamedNode | undefined\n if (targetClass) {\n queryParams.targetClass = targetClass\n }\n\n queryParams.objectURIBase = (kb.any(dataSource, ns.ui('objectURIBase'), null, dataSource.doc()) || undefined) as NamedNode | undefined\n\n /*\n if (!queryParams.targetClass) {\n const klass = kb.any(subject, ns.rdf('type')) as NamedNode | undefined\n // @@ be more selective of which class if many\n // @@ todo: Take ALL classes, and compare them with those the data source knows about\n // with translation where necessary. Find most specific of the classes for the search.\n if (!klass) throw new Error('Autocomplete: No class specified or is current type of' + subject)\n queryParams.targetClass = klass\n }\n */\n const endpoint = kb.anyJS(dataSource, ns.ui('endpoint'), null, dataSource.doc()) as string | undefined\n if (endpoint) { // SPARQL\n queryParams.endpoint = endpoint\n\n queryParams.searchByNameQuery = kb.anyJS(dataSource, ns.ui('searchByNameQuery'), null, dataSource.doc())\n if (!queryParams.searchByNameQuery) {\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No searchByNameQuery given for endpoint data Source: ' + form))\n }\n queryParams.insitituteDetailsQuery = kb.anyJS(dataSource, ns.ui('insitituteDetailsQuery'), null, dataSource.doc())\n } else {\n // return box.appendChild(\n // widgets.errorMessageBlock(dom, 'Error: No SPARQL endpoint given for autocomplete field: ' + form))\n const searchByNameURI = kb.anyJS(dataSource, ns.ui('searchByNameURI'))\n if (!searchByNameURI) {\n return box.appendChild(\n widgets.errorMessageBlock(dom, 'Error: No searchByNameURI OR sparql endpoint given for dataSource: ' + dataSource)\n )\n }\n queryParams.searchByNameURI = searchByNameURI\n }\n // It can be cleaner to just remove empty fields if you can't edit them anyway\n const suppressEmptyUneditable = kb.anyJS(form, ns.ui('suppressEmptyUneditable'), null, formDoc)\n const editable = kb.updater?.editable((doc as NamedNode).uri)\n\n const autocompleteOptions:AutocompleteOptions = { // cancelButton?: HTMLElement,\n permanent: true,\n targetClass: queryParams.targetClass, // @@ simplify?\n queryParams\n }\n\n autocompleteOptions.size = kb.anyJS(form, ns.ui('size'), null, formDoc) || undefined\n\n let obj = kb.any(subject, property as any, undefined, doc)\n if (!obj) {\n obj = kb.any(form, ns.ui('default'))\n if (obj) {\n autocompleteOptions.currentObject = obj as NamedNode\n autocompleteOptions.currentName = kb.any(autocompleteOptions.currentObject, labelProperty, null, doc) as Literal\n } else { // No data or default. Should we suprress the whole field?\n if (suppressEmptyUneditable && !editable) {\n box.style.display = 'none' // clutter removal\n return box\n }\n }\n } else { // get object and name from target data:\n autocompleteOptions.currentObject = obj as NamedNode\n autocompleteOptions.currentName = kb.any(autocompleteOptions.currentObject, labelProperty, null, doc) as Literal\n }\n\n lhs.appendChild(widgets.fieldLabel(dom, property as any, form))\n\n const barOptions = {\n editable,\n dbLookup: true\n }\n\n renderAutocompleteControl(dom, subject as NamedNode, barOptions, autocompleteOptions, addOneIdAndRefresh, deleteOne).then((control) => {\n rhs.appendChild(control)\n }, (err) => {\n rhs.appendChild(widgets.errorMessageBlock(dom, `Error rendering autocomplete ${form}: ${err}`, '#fee', err)) //\n })\n return box\n}\n\n// ends\n"],"mappings":"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"}
|
|
@@ -58,7 +58,7 @@ WHERE
|
|
|
58
58
|
# ?subsidiary rdfs:label ?subsidiaryLabel .
|
|
59
59
|
|
|
60
60
|
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE], fr". }
|
|
61
|
-
}`},g={"http://www.wikidata.org/entity/Q15936437":t.default.schema(`CollegeOrUniversity`),"http://www.wikidata.org/entity/Q1664720":t.default.schema(`EducationalOrganization`),"http://www.wikidata.org/entity/Q43229":t.default.schema(`Organization`),"http://www.wikidata.org/entity/Q3918":t.default.schema(`CollegeOrUniversity`),"http://www.wikidata.org/entity/Q170584":t.default.schema(`Project`),"http://www.wikidata.org/entity/Q327333":t.default.schema(`GovernmentOrganization`),"http://www.wikidata.org/entity/Q2221906":t.default.schema(`Place`),"http://www.wikidata.org/entity/Q167037":t.default.schema(`Corporation`)},_={targetClass:t.default.rdf(`type`),sealImage:t.default.schema(`logo`),shortName:t.default.foaf(`nick`),subsidiary:t.default.schema(`subOrganization`),city:t.default.vcard(`locality`),state:t.default.vcard(`region`),country:t.default.vcard(`country-name`),homepage:t.default.foaf(`homepage`),lat:t.default.schema(`latitude`),long:t.default.schema(`longitude`)};function v(e){let t=e.type.toLowerCase();if(t===`uri`||t===`iri`)return a.store.sym(e.value);if(t===`literal`)return e[`xml:lang`]?new i.Literal(e.value,e[`xml:lang`]):new i.Literal(e.value);throw Error(`bindingToTerm: Unexpected type "${e.type}" in sparql binding}`)}function y(e,r,a,o,s=_){let c={};n.log(`loadFromBindings: subject: ${r}`),n.log(` doc: ${o}`),a.forEach(e=>{for(let t in e){let n=e[t],r=JSON.stringify(n);c[t]=c[t]||new Set,c[t].add(r)}});for(let a in c){let l=c[a];n.log(` results ${a} -> ${l}`),l.forEach(c=>{let l=JSON.parse(c),{type:u,value:d}=l,f;if(u===`uri`)f=e.sym(d);else if(u===`literal`)f=new i.Literal(d,l.language,l.datatype);else throw Error(`loadFromBindings: unexpected type: ${u}`);if(a===`type`)g[d]?f=g[d]:n.warn(`Unmapped Wikidata Class: `+d);else if(a===`coordinates`){n.log(` @@@ hey a point: `+d);let a=/.*\(([-0-9.-]*) ([-0-9.-]*)\)/.exec(d);if(a){let n=t.default.xsd(`float`),s=new i.Literal(a[1],null,n),c=new i.Literal(a[2],null,n);e.add(r,t.default.schema(`longitude`),c,o),e.add(r,t.default.schema(`latitude`),s,o)}else n.log(`Bad coordinates syntax: `+d)}else{let i=s[a]||t.default.schema(a);e.add(r,i,f,o),n.log(` public data ${i} ${f}.`)}})}}function b(e){return e._embedded.results.map(e=>{let t=e.title,n=e.uri;return{name:{value:t,type:`literal`},subject:{type:`IRI`,value:n}}})}async function x(e,t,r){if(!r.searchByNameURI)throw Error(`Missing queryTarget.searchByNameURI on queryESCODataByName`);let i=r.limit||200,o=r.searchByNameURI.replace(`$(name)`,e).replace(`$(limit)`,``+i).replace(`$(targetClass)`,t.toNT());n.log(`Querying ESCO data - uri: `+o);let s=(await a.store.fetcher?.webOperation(`GET`,o,u))?.responseText||``;if(n.log(` Query result text`+s.slice(0,500)+`...`),s.length===0)throw Error(`Wot no text back from ESCO query `+o);let c=JSON.parse(s);return n.log(` ESCO Query result JSON`+JSON.stringify(c,null,4).slice(0,500)+`...`),b(c)}function S(e){let t=e.indexOf(`SPARQL-QUERY`);if(t<0)return e;n.warn(` ### Fixing JSON with wikidata error code injection `+e.slice(t,t+200));let r=e.lastIndexOf(`}, {`);return e.slice(0,r)+` } ] } } `}async function C(e,t,i,o){function s(n){let r=o.limit||200;return n.replace(`$(name)`,e).replace(`$(limit)`,``+r).replace(`$(language)`,c).replace(`$(targetClass)`,t.toNT())}if(!t)throw Error(`queryPublicDataByName: No class provided`);let c=(await r.getPreferredLanguages()||r.defaultPreferredLanguages)[0]||`en`;if(o.searchByNameQuery){let e=s(o.searchByNameQuery);return n.log(`Querying public data - sparql: `+e),w(e,o)}
|
|
61
|
+
}`},g={"http://www.wikidata.org/entity/Q15936437":t.default.schema(`CollegeOrUniversity`),"http://www.wikidata.org/entity/Q1664720":t.default.schema(`EducationalOrganization`),"http://www.wikidata.org/entity/Q43229":t.default.schema(`Organization`),"http://www.wikidata.org/entity/Q3918":t.default.schema(`CollegeOrUniversity`),"http://www.wikidata.org/entity/Q170584":t.default.schema(`Project`),"http://www.wikidata.org/entity/Q327333":t.default.schema(`GovernmentOrganization`),"http://www.wikidata.org/entity/Q2221906":t.default.schema(`Place`),"http://www.wikidata.org/entity/Q167037":t.default.schema(`Corporation`)},_={targetClass:t.default.rdf(`type`),sealImage:t.default.schema(`logo`),shortName:t.default.foaf(`nick`),subsidiary:t.default.schema(`subOrganization`),city:t.default.vcard(`locality`),state:t.default.vcard(`region`),country:t.default.vcard(`country-name`),homepage:t.default.foaf(`homepage`),lat:t.default.schema(`latitude`),long:t.default.schema(`longitude`)};function v(e){let t=e.type.toLowerCase();if(t===`uri`||t===`iri`)return a.store.sym(e.value);if(t===`literal`)return e[`xml:lang`]?new i.Literal(e.value,e[`xml:lang`]):new i.Literal(e.value);throw Error(`bindingToTerm: Unexpected type "${e.type}" in sparql binding}`)}function y(e,r,a,o,s=_){let c={};n.log(`loadFromBindings: subject: ${r}`),n.log(` doc: ${o}`),a.forEach(e=>{for(let t in e){let n=e[t],r=JSON.stringify(n);c[t]=c[t]||new Set,c[t].add(r)}});for(let a in c){let l=c[a];n.log(` results ${a} -> ${l}`),l.forEach(c=>{let l=JSON.parse(c),{type:u,value:d}=l,f;if(u===`uri`)f=e.sym(d);else if(u===`literal`)f=new i.Literal(d,l.language,l.datatype);else throw Error(`loadFromBindings: unexpected type: ${u}`);if(a===`type`)g[d]?f=g[d]:n.warn(`Unmapped Wikidata Class: `+d);else if(a===`coordinates`){n.log(` @@@ hey a point: `+d);let a=/.*\(([-0-9.-]*) ([-0-9.-]*)\)/.exec(d);if(a){let n=t.default.xsd(`float`),s=new i.Literal(a[1],null,n),c=new i.Literal(a[2],null,n);e.add(r,t.default.schema(`longitude`),c,o),e.add(r,t.default.schema(`latitude`),s,o)}else n.log(`Bad coordinates syntax: `+d)}else{let i=s[a]||t.default.schema(a);e.add(r,i,f,o),n.log(` public data ${i} ${f}.`)}})}}function b(e){return e._embedded.results.map(e=>{let t=e.title,n=e.uri;return{name:{value:t,type:`literal`},subject:{type:`IRI`,value:n}}})}async function x(e,t,r){if(!r.searchByNameURI)throw Error(`Missing queryTarget.searchByNameURI on queryESCODataByName`);let i=r.limit||200,o=r.searchByNameURI.replace(`$(name)`,e).replace(`$(limit)`,``+i).replace(`$(targetClass)`,t.toNT());n.log(`Querying ESCO data - uri: `+o);let s=(await a.store.fetcher?.webOperation(`GET`,o,u))?.responseText||``;if(n.log(` Query result text`+s.slice(0,500)+`...`),s.length===0)throw Error(`Wot no text back from ESCO query `+o);let c=JSON.parse(s);return n.log(` ESCO Query result JSON`+JSON.stringify(c,null,4).slice(0,500)+`...`),b(c)}function S(e){let t=e.indexOf(`SPARQL-QUERY`);if(t<0)return e;n.warn(` ### Fixing JSON with wikidata error code injection `+e.slice(t,t+200));let r=e.lastIndexOf(`}, {`);return e.slice(0,r)+` } ] } } `}async function C(e,t,i,o){function s(n){let r=o.limit||200;return n.replace(`$(name)`,e).replace(`$(limit)`,``+r).replace(`$(language)`,c).replace(`$(targetClass)`,t.toNT())}if(!t)throw Error(`queryPublicDataByName: No class provided`);let c=(await r.getPreferredLanguages()||r.defaultPreferredLanguages)[0]||`en`;if(o.searchByNameQuery){let e=s(o.searchByNameQuery);return n.log(`Querying public data - sparql: `+e),w(e,o)}if(o.searchByNameURI){let e=s(o.searchByNameURI),t;try{t=await a.store.fetcher?.webOperation(`GET`,e,u)}catch(t){throw Error(`Exception when trying to fetch ${e} \n ${t}`)}let r=t.responseText||``;if(t.status!==200)throw Error(`HTTP error status ${t.status} trying to fetch ${e} `);if(n.log(` Query result text`+r.slice(0,500)+`...`),r.length===0)throw Error(`queryPublicDataByName: No text back from public data query `+e);let i=S(r),c=JSON.parse(i);if(n.log(` API Query result JSON`+JSON.stringify(c,null,4).slice(0,500)+`...`),c._embedded)return n.log(` Looks like ESCO`),b(c);throw alert(`Code me: unrecognized API return format`),Error(`*** Need to add code to parse unrecognized API JSON return\n${JSON.stringify(c,null,4)}`)}throw Error(`Query source must have either rest API or SPARQL endpoint.`)}async function w(e,t){if(!t.endpoint)throw Error(`Missing queryTarget.endpoint required for queryPublicDataSelect`);let r=new URL(t.endpoint);r.searchParams.append(`query`,e);let i=r.href;n.log(` queryPublicDataSelect uri: `+i);let o=new Headers;o.append(`Accept`,`application/json`);let s={credentials:`omit`,headers:o},c=(await a.store.fetcher?.webOperation(`GET`,i,s))?.responseText||``;if(c.length===0)throw Error(`No text back from query `+i);let l=S(c),u=JSON.parse(l);return n.log(` Query result JSON`+JSON.stringify(u,null,4).slice(0,100)+`...`),u.results.bindings}async function T(e,t,r){if(n.log(`queryPublicDataConstruct: sparql:`,e),!r.endpoint)throw Error(`Missing queryTarget.endpoint required for queryPublicDataConstruct`);let o=new URL(r.endpoint);o.searchParams.append(`query`,e);let s=o.href;n.log(` queryPublicDataConstruct uri: `+s);let c=new Headers;c.append(`Accept`,`text/turtle`);let l={credentials:`omit`,headers:c},u=(await a.store.fetcher?.webOperation(`GET`,s,l))?.responseText||`No response text?`,d=u.length>500?u.slice(0,200)+` ... `+u.slice(-200):u;if(n.log(` queryPublicDataConstruct result text:`+d),u.length===0)throw Error(`queryPublicDataConstruct: No text back from construct query:`+s);(0,i.parse)(u,a.store,t.uri,`text/turtle`)}async function E(e,t,n){if(n.uri.startsWith(`https://dbpedia.org/resource/`))return A(e,t,n);if(n.uri.match(/^https?:\/\/www\.wikidata\.org\/entity\/.*/))await D(e,t,n);else{let t=n.uri.startsWith(`http:`)?e.sym(`https:`+n.uri.slice(5)):n,r=new Headers;return r.append(`Accept`,`text/turtle`),e.fetcher.load(t,{credentials:`omit`,headers:r})}}async function D(e,t,r){await T(l.replace(/wd:Q49108/g,r.toNT()),r,h),n.log(`getWikidataDetails: loaded.`,r)}async function O(e,t,n){y(e,n,await w(`select distinct * where {
|
|
62
62
|
optional { $(subject) wdt:P31 ?targetClass } # instance of
|
|
63
63
|
optional { $(subject) wdt:P154 ?logo }
|
|
64
64
|
optional { $(subject) wdt:P158 ?sealImage }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publicData.cjs.js","names":[],"sources":["../../../../src/widgets/forms/autocomplete/publicData.ts"],"sourcesContent":["/* Logic to access public data stores\n*\n* including filtering resut by natural language etc\n* See https://solidos.solidcommunity.net/public/2021/01%20Building%20Solid%20Apps%20which%20use%20Public%20Data.html\n*/\n\nimport { Literal, NamedNode, parse } from 'rdflib'\nimport { store } from 'solid-logic'\nimport * as debug from '../../../lib/debug'\nimport ns from '../../../lib/ns'\nimport { defaultPreferredLanguages, getPreferredLanguages } from './language'\n\nexport const AUTOCOMPLETE_LIMIT = 200 // How many to get from server\n// With 3000 we could exceed the wikidata timeout\n\nconst subjectRegexp = /\\$\\(subject\\)/g\n\ninterface Term {\n type: string;\n value: string\n}\n\nexport interface 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 limit?: number;\n logo?: NamedNode;\n searchByNameQuery?: string;\n searchByNameURI?: string;\n insitituteDetailsQuery?: string;\n endpoint?: string;\n objectURIBase?: NamedNode;\n targetClass?: NamedNode,\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 ResearchOrganization: 'http://www.wikidata.org/entity/Q31855',\n SportsOrganization: 'http://www.wikidata.org/entity/Q4438121'\n}\n\nexport const instituteDetailsWikidataQuery = `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\nexport const fetcherOptionsJsonPublicData = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // try to avoid CORS problems. Data is public so no auth\n headers: new Headers({ Accept: 'application/json' })\n}\n\nexport const escoParameters:QueryParameters = {\n label: 'ESCO',\n logo: store.sym('https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif'),\n searchByNameURI: 'https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)'\n // endpoint: undefined\n // returnFormat: 'ESCO',\n // targetClass: {}\n}\n\nexport const dbpediaParameters:QueryParameters = {\n label: 'DBPedia',\n logo: store.sym('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 $(targetClass); rdfs:label ?name\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit)`,\n endpoint: 'https://dbpedia.org/sparql/'\n}\n\nexport const dbPediaTypeMap = { AcademicInsitution: 'http://umbel.org/umbel/rc/EducationalOrganization' }\n\nexport const wikidataOutgoingClassMap = {\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\nexport const wikidataParameters = {\n label: 'WikiData',\n limit: 3000, // Need a high one as very many items, and many languages\n logo: store.sym('https://www.wikimedia.org/static/images/project-logos/wikidatawiki.png'),\n endpoint: 'https://query.wikidata.org/sparql',\n searchByNameQuery: `SELECT ?subject ?name\n WHERE {\n ?klass wdt:P279* $(targetClass) .\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\nexport const wikidataIncomingClassMap = {\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'), // govt agency\n 'http://www.wikidata.org/entity/Q2221906': ns.schema('Place'), // geographic location\n 'http://www.wikidata.org/entity/Q167037': ns.schema('Corporation') // Corporation\n\n}\nexport const variableNameToPredicateMap = { // allow other mappings to be added in theory hence var\n // wikidata:\n targetClass: 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 // dbpedia - :\n city: ns.vcard('locality'),\n state: ns.vcard('region'),\n country: ns.vcard('country-name'),\n homepage: ns.foaf('homepage'),\n lat: ns.schema('latitude'),\n long: ns.schema('longitude')\n}\n\nexport function bindingToTerm (item) {\n const typ = item.type.toLowerCase()\n if (typ === 'uri' || typ === 'iri') {\n return store.sym(item.value)\n } else if (typ === 'literal') {\n if (item['xml:lang']) {\n return new Literal(item.value, item['xml:lang'])\n } else {\n return new Literal(item.value)\n }\n } else {\n throw new Error(`bindingToTerm: Unexpected type \"${item.type}\" in sparql binding}`)\n }\n}\n\nexport function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc, predMap = variableNameToPredicateMap) {\n const results = {}\n debug.log(`loadFromBindings: subject: ${solidSubject}`)\n debug.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 debug.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 (wikidataIncomingClassMap[value]) {\n obj = wikidataIncomingClassMap[value]\n } else {\n debug.warn('Unmapped Wikidata Class: ' + value)\n }\n } else if (key === 'coordinates') {\n // const latlong = value // Like 'Point(-71.106111111 42.375)'\n debug.log(' @@@ hey a point: ' + value)\n // const regexp = /.*\\(([-0-9\\.-]*) ([-0-9\\.-]*)\\)/\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 } else {\n debug.log('Bad coordinates syntax: ' + value)\n }\n } else {\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 debug.log(` public data ${pred} ${obj}.`)\n }\n })\n }\n}\n\n/* ESCO sopecific\n*/\nexport function ESCOResultToBindings (json: Object): Bindings {\n const results = (json as any)._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' }, subject: { type: 'IRI', value: uri } } // simulate SPARQL bindings\n })\n return bindings\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) throw new Error('Missing queryTarget.searchByNameURI on queryESCODataByName')\n const limit = queryTarget.limit || AUTOCOMPLETE_LIMIT\n const queryURI = queryTarget.searchByNameURI\n .replace('$(name)', filter)\n .replace('$(limit)', '' + limit)\n .replace('$(targetClass)', theClass.toNT())\n debug.log('Querying ESCO data - uri: ' + queryURI)\n\n const response = await store.fetcher?.webOperation('GET', queryURI, fetcherOptionsJsonPublicData)\n const text = response?.responseText || ''\n debug.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('Whole JSON return object', json)\n debug.log(' ESCO Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n return ESCOResultToBindings(json)\n}\n\n/* Cope ithe syntax probelm in wikidata timeout responses\n*\n* Wikidata bug: https://phabricator.wikimedia.org/T283962\n* This will not be needed whn that WDQS bug fixed.\n* This is aptured in https://github.com/solidos/solid-ui/issues/403\n*/\nfunction fixWikidataJSON (str) {\n const syntaxProblem = str.indexOf('SPARQL-QUERY')\n if (syntaxProblem < 0) return str\n // console.log('@@ fixWikidataJSON FIXING')\n debug.warn(' ### Fixing JSON with wikidata error code injection ' + str.slice(syntaxProblem, syntaxProblem + 200))\n const goodness = str.lastIndexOf('}, {')\n return str.slice(0, goodness) + ' } ] } } ' // Close binding, array, bindings, results, root object\n}\n/* Query all entities of given class and partially matching name\n*/\nexport async function queryPublicDataByName (\n filter: string,\n theClass:NamedNode,\n languages: Array<string>,\n queryTarget: QueryParameters): Promise<Bindings> {\n function substituteStrings (template: string):string {\n const limit = queryTarget.limit || AUTOCOMPLETE_LIMIT\n const u1 = template.replace('$(name)', filter)\n .replace('$(limit)', '' + limit)\n .replace('$(language)', language)\n return u1.replace('$(targetClass)', theClass.toNT())\n }\n\n if (!theClass) {\n throw new Error('queryPublicDataByName: No class provided')\n }\n\n const languagePrefs = await getPreferredLanguages() || defaultPreferredLanguages\n const language = languagePrefs[0] || 'en'\n if (queryTarget.searchByNameQuery) {\n const sparql = substituteStrings(queryTarget.searchByNameQuery)\n debug.log('Querying public data - sparql: ' + sparql)\n return queryPublicDataSelect(sparql, queryTarget)\n } else if (queryTarget.searchByNameURI) { // not sparql - random API\n const queryURI = substituteStrings(queryTarget.searchByNameURI)\n let response\n try {\n response = await store.fetcher?.webOperation('GET', queryURI, fetcherOptionsJsonPublicData)\n } catch (err) {\n throw new Error(`Exception when trying to fetch ${queryURI} \\n ${err}`)\n }\n const text = response.responseText || '' // ts\n if (response.status !== 200) {\n throw new Error(`HTTP error status ${response.status} trying to fetch ${queryURI} `)\n }\n debug.log(' Query result text' + text.slice(0, 500) + '...')\n if (text.length === 0) throw new Error('queryPublicDataByName: No text back from public data query ' + queryURI)\n const text2 = fixWikidataJSON(text) // Kludge: strip of interrupting error message\n const json = JSON.parse(text2)\n debug.log(' API Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n if ((json as any)._embedded) {\n debug.log(' Looks like ESCO')\n const bindings = ESCOResultToBindings(json)\n return bindings\n } else {\n alert('Code me: unrecognized API return format')\n throw new Error(`*** Need to add code to parse unrecognized API JSON return\\n${JSON.stringify(json, null, 4)}`)\n }\n } else {\n throw new Error('Query source must have either rest API or SPARQL endpoint.')\n }\n}\n\n/* Query a database using SPARQL SELECT\n*/\nexport async function queryPublicDataSelect (sparql: string, queryTarget: QueryParameters): Promise<Bindings> {\n if (!queryTarget.endpoint) throw new Error('Missing queryTarget.endpoint required for queryPublicDataSelect')\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n debug.log(' queryPublicDataSelect uri: ' + queryURI)\n const headers = new Headers()\n headers.append('Accept', 'application/json')\n const options = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // CORS - as we know it is public\n headers\n }\n\n const response = await store.fetcher?.webOperation('GET', queryURI, options)\n\n const text = response?.responseText || ''\n if (text.length === 0) throw new Error('No text back from query ' + queryURI)\n const text2 = fixWikidataJSON(text)\n const json = JSON.parse(text2)\n debug.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 100) + '...')\n const bindings = json.results.bindings\n return bindings\n}\n\n/* Load from a database using SPARQL CONSTRUCT\n*/\nexport async function queryPublicDataConstruct (sparql: string, pubicId: NamedNode, queryTarget: QueryParameters): Promise<void> {\n debug.log('queryPublicDataConstruct: sparql:', sparql)\n if (!queryTarget.endpoint) throw new Error('Missing queryTarget.endpoint required for queryPublicDataConstruct')\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n debug.log(' queryPublicDataConstruct uri: ' + queryURI)\n const headers = new Headers()\n headers.append('Accept', 'text/turtle')\n const options = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // CORS // @tsc pain\n headers // ({ Accept: 'text/turtle' } as Headers)\n }\n const response = await store.fetcher?.webOperation('GET', queryURI, options)\n const text = response?.responseText || 'No response text?'\n const report = text.length > 500 ? text.slice(0, 200) + ' ... ' + text.slice(-200) : text\n debug.log(' queryPublicDataConstruct result text:' + report)\n if (text.length === 0) throw new Error('queryPublicDataConstruct: No text back from construct query:' + queryURI)\n parse(text, store, pubicId.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 // const QId = publicDataID.uri.split('/')[4]\n // const dataURI = `http://www.wikidata.org/wiki/Special:EntityData/${QId}.ttl`\n // In fact loading the data URI gives much too much irrelevant data, from wikidata, so we do a query.\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 const headers = new Headers()\n headers.append('Accept', 'text/turtle')\n return kb.fetcher.load(iDToFetch, {\n credentials: 'omit' as 'include' | 'omit' | undefined,\n headers\n })\n }\n}\n\nexport async function getWikidataDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const subjRegexp = /wd:Q49108/g\n const sparql = instituteDetailsWikidataQuery.replace(subjRegexp, publicDataID.toNT())\n await queryPublicDataConstruct(sparql, publicDataID, wikidataParameters)\n debug.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 ?targetClass } # 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.toNT())\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.toNT())\n debug.log(' location query sparql:' + sparql)\n const bindings = await queryPublicDataSelect(sparql, wikidataParameters)\n debug.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 const bindings = await queryPublicDataSelect(sparql, dbpediaParameters)\n loadFromBindings(kb, publicDataID, bindings, publicDataID.doc())\n debug.log('Finished getDbpediaDetails.')\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"publicData.cjs.js","names":[],"sources":["../../../../src/widgets/forms/autocomplete/publicData.ts"],"sourcesContent":["/* Logic to access public data stores\n*\n* including filtering resut by natural language etc\n* See https://solidos.solidcommunity.net/public/2021/01%20Building%20Solid%20Apps%20which%20use%20Public%20Data.html\n*/\n\nimport { Literal, NamedNode, parse } from 'rdflib'\nimport { store } from 'solid-logic'\nimport * as debug from '../../../lib/debug'\nimport ns from '../../../lib/ns'\nimport { defaultPreferredLanguages, getPreferredLanguages } from './language'\n\nexport const AUTOCOMPLETE_LIMIT = 200 // How many to get from server\n// With 3000 we could exceed the wikidata timeout\n\nconst subjectRegexp = /\\$\\(subject\\)/g\n\ninterface Term {\n type: string;\n value: string\n}\n\nexport interface 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 limit?: number;\n logo?: NamedNode;\n searchByNameQuery?: string;\n searchByNameURI?: string;\n insitituteDetailsQuery?: string;\n endpoint?: string;\n objectURIBase?: NamedNode;\n targetClass?: NamedNode,\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 ResearchOrganization: 'http://www.wikidata.org/entity/Q31855',\n SportsOrganization: 'http://www.wikidata.org/entity/Q4438121'\n}\n\nexport const instituteDetailsWikidataQuery = `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\nexport const fetcherOptionsJsonPublicData = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // try to avoid CORS problems. Data is public so no auth\n headers: new Headers({ Accept: 'application/json' })\n}\n\nexport const escoParameters:QueryParameters = {\n label: 'ESCO',\n logo: store.sym('https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif'),\n searchByNameURI: 'https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)'\n // endpoint: undefined\n // returnFormat: 'ESCO',\n // targetClass: {}\n}\n\nexport const dbpediaParameters:QueryParameters = {\n label: 'DBPedia',\n logo: store.sym('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 $(targetClass); rdfs:label ?name\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit)`,\n endpoint: 'https://dbpedia.org/sparql/'\n}\n\nexport const dbPediaTypeMap = { AcademicInsitution: 'http://umbel.org/umbel/rc/EducationalOrganization' }\n\nexport const wikidataOutgoingClassMap = {\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\nexport const wikidataParameters = {\n label: 'WikiData',\n limit: 3000, // Need a high one as very many items, and many languages\n logo: store.sym('https://www.wikimedia.org/static/images/project-logos/wikidatawiki.png'),\n endpoint: 'https://query.wikidata.org/sparql',\n searchByNameQuery: `SELECT ?subject ?name\n WHERE {\n ?klass wdt:P279* $(targetClass) .\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\nexport const wikidataIncomingClassMap = {\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'), // govt agency\n 'http://www.wikidata.org/entity/Q2221906': ns.schema('Place'), // geographic location\n 'http://www.wikidata.org/entity/Q167037': ns.schema('Corporation') // Corporation\n\n}\nexport const variableNameToPredicateMap = { // allow other mappings to be added in theory hence var\n // wikidata:\n targetClass: 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 // dbpedia - :\n city: ns.vcard('locality'),\n state: ns.vcard('region'),\n country: ns.vcard('country-name'),\n homepage: ns.foaf('homepage'),\n lat: ns.schema('latitude'),\n long: ns.schema('longitude')\n}\n\nexport function bindingToTerm (item) {\n const typ = item.type.toLowerCase()\n if (typ === 'uri' || typ === 'iri') {\n return store.sym(item.value)\n } else if (typ === 'literal') {\n if (item['xml:lang']) {\n return new Literal(item.value, item['xml:lang'])\n } else {\n return new Literal(item.value)\n }\n } else {\n throw new Error(`bindingToTerm: Unexpected type \"${item.type}\" in sparql binding}`)\n }\n}\n\nexport function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc, predMap = variableNameToPredicateMap) {\n const results = {}\n debug.log(`loadFromBindings: subject: ${solidSubject}`)\n debug.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 debug.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 (wikidataIncomingClassMap[value]) {\n obj = wikidataIncomingClassMap[value]\n } else {\n debug.warn('Unmapped Wikidata Class: ' + value)\n }\n } else if (key === 'coordinates') {\n // const latlong = value // Like 'Point(-71.106111111 42.375)'\n debug.log(' @@@ hey a point: ' + value)\n // const regexp = /.*\\(([-0-9\\.-]*) ([-0-9\\.-]*)\\)/\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 } else {\n debug.log('Bad coordinates syntax: ' + value)\n }\n } else {\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 debug.log(` public data ${pred} ${obj}.`)\n }\n })\n }\n}\n\n/* ESCO sopecific\n*/\nexport function ESCOResultToBindings (json: Object): Bindings {\n const results = (json as any)._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' }, subject: { type: 'IRI', value: uri } } // simulate SPARQL bindings\n })\n return bindings\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) throw new Error('Missing queryTarget.searchByNameURI on queryESCODataByName')\n const limit = queryTarget.limit || AUTOCOMPLETE_LIMIT\n const queryURI = queryTarget.searchByNameURI\n .replace('$(name)', filter)\n .replace('$(limit)', '' + limit)\n .replace('$(targetClass)', theClass.toNT())\n debug.log('Querying ESCO data - uri: ' + queryURI)\n\n const response = await store.fetcher?.webOperation('GET', queryURI, fetcherOptionsJsonPublicData)\n const text = response?.responseText || ''\n debug.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('Whole JSON return object', json)\n debug.log(' ESCO Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n return ESCOResultToBindings(json)\n}\n\n/* Cope ithe syntax probelm in wikidata timeout responses\n*\n* Wikidata bug: https://phabricator.wikimedia.org/T283962\n* This will not be needed whn that WDQS bug fixed.\n* This is aptured in https://github.com/solidos/solid-ui/issues/403\n*/\nfunction fixWikidataJSON (str) {\n const syntaxProblem = str.indexOf('SPARQL-QUERY')\n if (syntaxProblem < 0) return str\n // console.log('@@ fixWikidataJSON FIXING')\n debug.warn(' ### Fixing JSON with wikidata error code injection ' + str.slice(syntaxProblem, syntaxProblem + 200))\n const goodness = str.lastIndexOf('}, {')\n return str.slice(0, goodness) + ' } ] } } ' // Close binding, array, bindings, results, root object\n}\n/* Query all entities of given class and partially matching name\n*/\nexport async function queryPublicDataByName (\n filter: string,\n theClass:NamedNode,\n languages: Array<string>,\n queryTarget: QueryParameters): Promise<Bindings> {\n function substituteStrings (template: string):string {\n const limit = queryTarget.limit || AUTOCOMPLETE_LIMIT\n const u1 = template.replace('$(name)', filter)\n .replace('$(limit)', '' + limit)\n .replace('$(language)', language)\n return u1.replace('$(targetClass)', theClass.toNT())\n }\n\n if (!theClass) {\n throw new Error('queryPublicDataByName: No class provided')\n }\n\n const languagePrefs = await getPreferredLanguages() || defaultPreferredLanguages\n const language = languagePrefs[0] || 'en'\n if (queryTarget.searchByNameQuery) {\n const sparql = substituteStrings(queryTarget.searchByNameQuery)\n debug.log('Querying public data - sparql: ' + sparql)\n return queryPublicDataSelect(sparql, queryTarget)\n } else if (queryTarget.searchByNameURI) { // not sparql - random API\n const queryURI = substituteStrings(queryTarget.searchByNameURI)\n let response\n try {\n response = await store.fetcher?.webOperation('GET', queryURI, fetcherOptionsJsonPublicData)\n } catch (err) {\n throw new Error(`Exception when trying to fetch ${queryURI} \\n ${err}`)\n }\n const text = response.responseText || '' // ts\n if (response.status !== 200) {\n throw new Error(`HTTP error status ${response.status} trying to fetch ${queryURI} `)\n }\n debug.log(' Query result text' + text.slice(0, 500) + '...')\n if (text.length === 0) throw new Error('queryPublicDataByName: No text back from public data query ' + queryURI)\n const text2 = fixWikidataJSON(text) // Kludge: strip of interrupting error message\n const json = JSON.parse(text2)\n debug.log(' API Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n if ((json as any)._embedded) {\n debug.log(' Looks like ESCO')\n const bindings = ESCOResultToBindings(json)\n return bindings\n } else {\n alert('Code me: unrecognized API return format')\n throw new Error(`*** Need to add code to parse unrecognized API JSON return\\n${JSON.stringify(json, null, 4)}`)\n }\n } else {\n throw new Error('Query source must have either rest API or SPARQL endpoint.')\n }\n}\n\n/* Query a database using SPARQL SELECT\n*/\nexport async function queryPublicDataSelect (sparql: string, queryTarget: QueryParameters): Promise<Bindings> {\n if (!queryTarget.endpoint) throw new Error('Missing queryTarget.endpoint required for queryPublicDataSelect')\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n debug.log(' queryPublicDataSelect uri: ' + queryURI)\n const headers = new Headers()\n headers.append('Accept', 'application/json')\n const options = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // CORS - as we know it is public\n headers\n }\n\n const response = await store.fetcher?.webOperation('GET', queryURI, options)\n\n const text = response?.responseText || ''\n if (text.length === 0) throw new Error('No text back from query ' + queryURI)\n const text2 = fixWikidataJSON(text)\n const json = JSON.parse(text2)\n debug.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 100) + '...')\n const bindings = json.results.bindings\n return bindings\n}\n\n/* Load from a database using SPARQL CONSTRUCT\n*/\nexport async function queryPublicDataConstruct (sparql: string, pubicId: NamedNode, queryTarget: QueryParameters): Promise<void> {\n debug.log('queryPublicDataConstruct: sparql:', sparql)\n if (!queryTarget.endpoint) throw new Error('Missing queryTarget.endpoint required for queryPublicDataConstruct')\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n debug.log(' queryPublicDataConstruct uri: ' + queryURI)\n const headers = new Headers()\n headers.append('Accept', 'text/turtle')\n const options = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // CORS // @tsc pain\n headers // ({ Accept: 'text/turtle' } as Headers)\n }\n const response = await store.fetcher?.webOperation('GET', queryURI, options)\n const text = response?.responseText || 'No response text?'\n const report = text.length > 500 ? text.slice(0, 200) + ' ... ' + text.slice(-200) : text\n debug.log(' queryPublicDataConstruct result text:' + report)\n if (text.length === 0) throw new Error('queryPublicDataConstruct: No text back from construct query:' + queryURI)\n parse(text, store, pubicId.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 // const QId = publicDataID.uri.split('/')[4]\n // const dataURI = `http://www.wikidata.org/wiki/Special:EntityData/${QId}.ttl`\n // In fact loading the data URI gives much too much irrelevant data, from wikidata, so we do a query.\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 const headers = new Headers()\n headers.append('Accept', 'text/turtle')\n return kb.fetcher.load(iDToFetch, {\n credentials: 'omit' as 'include' | 'omit' | undefined,\n headers\n })\n }\n}\n\nexport async function getWikidataDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const subjRegexp = /wd:Q49108/g\n const sparql = instituteDetailsWikidataQuery.replace(subjRegexp, publicDataID.toNT())\n await queryPublicDataConstruct(sparql, publicDataID, wikidataParameters)\n debug.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 ?targetClass } # 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.toNT())\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.toNT())\n debug.log(' location query sparql:' + sparql)\n const bindings = await queryPublicDataSelect(sparql, wikidataParameters)\n debug.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 const bindings = await queryPublicDataSelect(sparql, dbpediaParameters)\n loadFromBindings(kb, publicDataID, bindings, publicDataID.doc())\n debug.log('Finished getDbpediaDetails.')\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NamedNode } from 'rdflib';
|
|
2
2
|
export declare const AUTOCOMPLETE_LIMIT = 200;
|
|
3
3
|
interface Term {
|
|
4
4
|
type: string;
|
|
@@ -55,7 +55,7 @@ export declare const wikidataOutgoingClassMap: {
|
|
|
55
55
|
export declare const wikidataParameters: {
|
|
56
56
|
label: string;
|
|
57
57
|
limit: number;
|
|
58
|
-
logo:
|
|
58
|
+
logo: any;
|
|
59
59
|
endpoint: string;
|
|
60
60
|
searchByNameQuery: string;
|
|
61
61
|
insitituteDetailsQuery: string;
|
|
@@ -82,7 +82,7 @@ export declare const variableNameToPredicateMap: {
|
|
|
82
82
|
lat: any;
|
|
83
83
|
long: any;
|
|
84
84
|
};
|
|
85
|
-
export declare function bindingToTerm(item: any):
|
|
85
|
+
export declare function bindingToTerm(item: any): any;
|
|
86
86
|
export declare function loadFromBindings(kb: any, solidSubject: NamedNode, bindings: any, doc: any, predMap?: {
|
|
87
87
|
targetClass: any;
|
|
88
88
|
sealImage: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publicData.d.ts","sourceRoot":"","sources":["../../../../src/widgets/forms/autocomplete/publicData.ts"],"names":[],"mappings":"AAMA,OAAO,
|
|
1
|
+
{"version":3,"file":"publicData.d.ts","sourceRoot":"","sources":["../../../../src/widgets/forms/autocomplete/publicData.ts"],"names":[],"mappings":"AAMA,OAAO,EAAW,SAAS,EAAS,MAAM,QAAQ,CAAA;AAMlD,eAAO,MAAM,kBAAkB,MAAM,CAAA;AAKrC,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,QAAQ,CAAC,EAAE,IAAI,CAAA;IACf,WAAW,CAAC,EAAE,IAAI,CAAA;CACnB;AAED,KAAK,QAAQ,GAAG,OAAO,EAAE,CAAA;AAEzB,MAAM,MAAM,eAAe,GAC3B;IACE,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB,CAAA;AAID,eAAO,MAAM,eAAe;;;;;;;;;;;CAY3B,CAAA;AAED,eAAO,MAAM,6BAA6B,u5CAmCxC,CAAA;AAEF,eAAO,MAAM,4BAA4B;iBAChB,SAAS,GAAG,MAAM,GAAG,SAAS;;CAEtD,CAAA;AAED,eAAO,MAAM,cAAc,EAAC,eAO3B,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAC,eAQ9B,CAAA;AAED,eAAO,MAAM,cAAc;;CAA8E,CAAA;AAEzG,eAAO,MAAM,wBAAwB;;;;;;;CAOpC,CAAA;AAED,eAAO,MAAM,kBAAkB;;;;;;;CA8B9B,CAAA;AAED,eAAO,MAAM,wBAAwB;;;;;;;;;CAUpC,CAAA;AACD,eAAO,MAAM,0BAA0B;;;;;;;;;;;CAetC,CAAA;AAED,wBAAgB,aAAa,CAAE,IAAI,KAAA,OAalC;AAED,wBAAgB,gBAAgB,CAAE,EAAE,KAAA,EAAE,YAAY,EAAC,SAAS,EAAE,QAAQ,KAAA,EAAE,GAAG,KAAA,EAAE,OAAO;;;;;;;;;;;CAA6B,QAsDhH;AAID,wBAAgB,oBAAoB,CAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAQ5D;AAID,wBAAsB,mBAAmB,CAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAC,SAAS,EAAE,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiB9H;AAkBD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAC,SAAS,EAClB,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EACxB,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+CjD;AAID,wBAAsB,qBAAqB,CAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsB5G;AAID,wBAAsB,wBAAwB,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB/H;AAED,wBAAsB,mBAAmB,CAAE,EAAE,KAAA,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,gBAoBzF;AAED,wBAAsB,kBAAkB,CAAE,EAAE,KAAA,EAAE,YAAY,EAAC,SAAS,EAAE,YAAY,EAAC,SAAS,iBAK3F;AAED,wBAAsB,qBAAqB,CAAE,EAAE,KAAA,EAAE,YAAY,EAAC,SAAS,EAAE,YAAY,EAAC,SAAS,iBAiB9F;AAED,wBAAsB,mBAAmB,CAAE,EAAE,KAAA,EAAE,YAAY,EAAC,SAAS,EAAE,YAAY,EAAC,SAAS,iBAgB5F;AAED,wBAAsB,iBAAiB,CAAE,EAAE,KAAA,EAAE,YAAY,EAAC,SAAS,EAAE,YAAY,EAAC,SAAS,iBAa1F"}
|
|
@@ -164,7 +164,8 @@ async function E(e, t, r, o) {
|
|
|
164
164
|
if (o.searchByNameQuery) {
|
|
165
165
|
let e = s(o.searchByNameQuery);
|
|
166
166
|
return n("Querying public data - sparql: " + e), D(e, o);
|
|
167
|
-
}
|
|
167
|
+
}
|
|
168
|
+
if (o.searchByNameURI) {
|
|
168
169
|
let e = s(o.searchByNameURI), t;
|
|
169
170
|
try {
|
|
170
171
|
t = await c.fetcher?.webOperation("GET", e, p);
|
|
@@ -177,7 +178,8 @@ async function E(e, t, r, o) {
|
|
|
177
178
|
let i = T(r), a = JSON.parse(i);
|
|
178
179
|
if (n(" API Query result JSON" + JSON.stringify(a, null, 4).slice(0, 500) + "..."), a._embedded) return n(" Looks like ESCO"), C(a);
|
|
179
180
|
throw alert("Code me: unrecognized API return format"), Error(`*** Need to add code to parse unrecognized API JSON return\n${JSON.stringify(a, null, 4)}`);
|
|
180
|
-
}
|
|
181
|
+
}
|
|
182
|
+
throw Error("Query source must have either rest API or SPARQL endpoint.");
|
|
181
183
|
}
|
|
182
184
|
async function D(e, t) {
|
|
183
185
|
if (!t.endpoint) throw Error("Missing queryTarget.endpoint required for queryPublicDataSelect");
|
|
@@ -206,8 +208,8 @@ async function O(e, t, r) {
|
|
|
206
208
|
let l = {
|
|
207
209
|
credentials: "omit",
|
|
208
210
|
headers: o
|
|
209
|
-
}, u = (await c.fetcher?.webOperation("GET", a, l))?.responseText || "No response text?";
|
|
210
|
-
if (n(" queryPublicDataConstruct result text:" +
|
|
211
|
+
}, u = (await c.fetcher?.webOperation("GET", a, l))?.responseText || "No response text?", d = u.length > 500 ? u.slice(0, 200) + " ... " + u.slice(-200) : u;
|
|
212
|
+
if (n(" queryPublicDataConstruct result text:" + d), u.length === 0) throw Error("queryPublicDataConstruct: No text back from construct query:" + a);
|
|
211
213
|
s(u, c, t.uri, "text/turtle");
|
|
212
214
|
}
|
|
213
215
|
async function k(e, t, n) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publicData.esm.js","names":[],"sources":["../../../../src/widgets/forms/autocomplete/publicData.ts"],"sourcesContent":["/* Logic to access public data stores\n*\n* including filtering resut by natural language etc\n* See https://solidos.solidcommunity.net/public/2021/01%20Building%20Solid%20Apps%20which%20use%20Public%20Data.html\n*/\n\nimport { Literal, NamedNode, parse } from 'rdflib'\nimport { store } from 'solid-logic'\nimport * as debug from '../../../lib/debug'\nimport ns from '../../../lib/ns'\nimport { defaultPreferredLanguages, getPreferredLanguages } from './language'\n\nexport const AUTOCOMPLETE_LIMIT = 200 // How many to get from server\n// With 3000 we could exceed the wikidata timeout\n\nconst subjectRegexp = /\\$\\(subject\\)/g\n\ninterface Term {\n type: string;\n value: string\n}\n\nexport interface 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 limit?: number;\n logo?: NamedNode;\n searchByNameQuery?: string;\n searchByNameURI?: string;\n insitituteDetailsQuery?: string;\n endpoint?: string;\n objectURIBase?: NamedNode;\n targetClass?: NamedNode,\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 ResearchOrganization: 'http://www.wikidata.org/entity/Q31855',\n SportsOrganization: 'http://www.wikidata.org/entity/Q4438121'\n}\n\nexport const instituteDetailsWikidataQuery = `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\nexport const fetcherOptionsJsonPublicData = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // try to avoid CORS problems. Data is public so no auth\n headers: new Headers({ Accept: 'application/json' })\n}\n\nexport const escoParameters:QueryParameters = {\n label: 'ESCO',\n logo: store.sym('https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif'),\n searchByNameURI: 'https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)'\n // endpoint: undefined\n // returnFormat: 'ESCO',\n // targetClass: {}\n}\n\nexport const dbpediaParameters:QueryParameters = {\n label: 'DBPedia',\n logo: store.sym('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 $(targetClass); rdfs:label ?name\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit)`,\n endpoint: 'https://dbpedia.org/sparql/'\n}\n\nexport const dbPediaTypeMap = { AcademicInsitution: 'http://umbel.org/umbel/rc/EducationalOrganization' }\n\nexport const wikidataOutgoingClassMap = {\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\nexport const wikidataParameters = {\n label: 'WikiData',\n limit: 3000, // Need a high one as very many items, and many languages\n logo: store.sym('https://www.wikimedia.org/static/images/project-logos/wikidatawiki.png'),\n endpoint: 'https://query.wikidata.org/sparql',\n searchByNameQuery: `SELECT ?subject ?name\n WHERE {\n ?klass wdt:P279* $(targetClass) .\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\nexport const wikidataIncomingClassMap = {\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'), // govt agency\n 'http://www.wikidata.org/entity/Q2221906': ns.schema('Place'), // geographic location\n 'http://www.wikidata.org/entity/Q167037': ns.schema('Corporation') // Corporation\n\n}\nexport const variableNameToPredicateMap = { // allow other mappings to be added in theory hence var\n // wikidata:\n targetClass: 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 // dbpedia - :\n city: ns.vcard('locality'),\n state: ns.vcard('region'),\n country: ns.vcard('country-name'),\n homepage: ns.foaf('homepage'),\n lat: ns.schema('latitude'),\n long: ns.schema('longitude')\n}\n\nexport function bindingToTerm (item) {\n const typ = item.type.toLowerCase()\n if (typ === 'uri' || typ === 'iri') {\n return store.sym(item.value)\n } else if (typ === 'literal') {\n if (item['xml:lang']) {\n return new Literal(item.value, item['xml:lang'])\n } else {\n return new Literal(item.value)\n }\n } else {\n throw new Error(`bindingToTerm: Unexpected type \"${item.type}\" in sparql binding}`)\n }\n}\n\nexport function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc, predMap = variableNameToPredicateMap) {\n const results = {}\n debug.log(`loadFromBindings: subject: ${solidSubject}`)\n debug.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 debug.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 (wikidataIncomingClassMap[value]) {\n obj = wikidataIncomingClassMap[value]\n } else {\n debug.warn('Unmapped Wikidata Class: ' + value)\n }\n } else if (key === 'coordinates') {\n // const latlong = value // Like 'Point(-71.106111111 42.375)'\n debug.log(' @@@ hey a point: ' + value)\n // const regexp = /.*\\(([-0-9\\.-]*) ([-0-9\\.-]*)\\)/\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 } else {\n debug.log('Bad coordinates syntax: ' + value)\n }\n } else {\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 debug.log(` public data ${pred} ${obj}.`)\n }\n })\n }\n}\n\n/* ESCO sopecific\n*/\nexport function ESCOResultToBindings (json: Object): Bindings {\n const results = (json as any)._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' }, subject: { type: 'IRI', value: uri } } // simulate SPARQL bindings\n })\n return bindings\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) throw new Error('Missing queryTarget.searchByNameURI on queryESCODataByName')\n const limit = queryTarget.limit || AUTOCOMPLETE_LIMIT\n const queryURI = queryTarget.searchByNameURI\n .replace('$(name)', filter)\n .replace('$(limit)', '' + limit)\n .replace('$(targetClass)', theClass.toNT())\n debug.log('Querying ESCO data - uri: ' + queryURI)\n\n const response = await store.fetcher?.webOperation('GET', queryURI, fetcherOptionsJsonPublicData)\n const text = response?.responseText || ''\n debug.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('Whole JSON return object', json)\n debug.log(' ESCO Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n return ESCOResultToBindings(json)\n}\n\n/* Cope ithe syntax probelm in wikidata timeout responses\n*\n* Wikidata bug: https://phabricator.wikimedia.org/T283962\n* This will not be needed whn that WDQS bug fixed.\n* This is aptured in https://github.com/solidos/solid-ui/issues/403\n*/\nfunction fixWikidataJSON (str) {\n const syntaxProblem = str.indexOf('SPARQL-QUERY')\n if (syntaxProblem < 0) return str\n // console.log('@@ fixWikidataJSON FIXING')\n debug.warn(' ### Fixing JSON with wikidata error code injection ' + str.slice(syntaxProblem, syntaxProblem + 200))\n const goodness = str.lastIndexOf('}, {')\n return str.slice(0, goodness) + ' } ] } } ' // Close binding, array, bindings, results, root object\n}\n/* Query all entities of given class and partially matching name\n*/\nexport async function queryPublicDataByName (\n filter: string,\n theClass:NamedNode,\n languages: Array<string>,\n queryTarget: QueryParameters): Promise<Bindings> {\n function substituteStrings (template: string):string {\n const limit = queryTarget.limit || AUTOCOMPLETE_LIMIT\n const u1 = template.replace('$(name)', filter)\n .replace('$(limit)', '' + limit)\n .replace('$(language)', language)\n return u1.replace('$(targetClass)', theClass.toNT())\n }\n\n if (!theClass) {\n throw new Error('queryPublicDataByName: No class provided')\n }\n\n const languagePrefs = await getPreferredLanguages() || defaultPreferredLanguages\n const language = languagePrefs[0] || 'en'\n if (queryTarget.searchByNameQuery) {\n const sparql = substituteStrings(queryTarget.searchByNameQuery)\n debug.log('Querying public data - sparql: ' + sparql)\n return queryPublicDataSelect(sparql, queryTarget)\n } else if (queryTarget.searchByNameURI) { // not sparql - random API\n const queryURI = substituteStrings(queryTarget.searchByNameURI)\n let response\n try {\n response = await store.fetcher?.webOperation('GET', queryURI, fetcherOptionsJsonPublicData)\n } catch (err) {\n throw new Error(`Exception when trying to fetch ${queryURI} \\n ${err}`)\n }\n const text = response.responseText || '' // ts\n if (response.status !== 200) {\n throw new Error(`HTTP error status ${response.status} trying to fetch ${queryURI} `)\n }\n debug.log(' Query result text' + text.slice(0, 500) + '...')\n if (text.length === 0) throw new Error('queryPublicDataByName: No text back from public data query ' + queryURI)\n const text2 = fixWikidataJSON(text) // Kludge: strip of interrupting error message\n const json = JSON.parse(text2)\n debug.log(' API Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n if ((json as any)._embedded) {\n debug.log(' Looks like ESCO')\n const bindings = ESCOResultToBindings(json)\n return bindings\n } else {\n alert('Code me: unrecognized API return format')\n throw new Error(`*** Need to add code to parse unrecognized API JSON return\\n${JSON.stringify(json, null, 4)}`)\n }\n } else {\n throw new Error('Query source must have either rest API or SPARQL endpoint.')\n }\n}\n\n/* Query a database using SPARQL SELECT\n*/\nexport async function queryPublicDataSelect (sparql: string, queryTarget: QueryParameters): Promise<Bindings> {\n if (!queryTarget.endpoint) throw new Error('Missing queryTarget.endpoint required for queryPublicDataSelect')\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n debug.log(' queryPublicDataSelect uri: ' + queryURI)\n const headers = new Headers()\n headers.append('Accept', 'application/json')\n const options = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // CORS - as we know it is public\n headers\n }\n\n const response = await store.fetcher?.webOperation('GET', queryURI, options)\n\n const text = response?.responseText || ''\n if (text.length === 0) throw new Error('No text back from query ' + queryURI)\n const text2 = fixWikidataJSON(text)\n const json = JSON.parse(text2)\n debug.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 100) + '...')\n const bindings = json.results.bindings\n return bindings\n}\n\n/* Load from a database using SPARQL CONSTRUCT\n*/\nexport async function queryPublicDataConstruct (sparql: string, pubicId: NamedNode, queryTarget: QueryParameters): Promise<void> {\n debug.log('queryPublicDataConstruct: sparql:', sparql)\n if (!queryTarget.endpoint) throw new Error('Missing queryTarget.endpoint required for queryPublicDataConstruct')\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n debug.log(' queryPublicDataConstruct uri: ' + queryURI)\n const headers = new Headers()\n headers.append('Accept', 'text/turtle')\n const options = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // CORS // @tsc pain\n headers // ({ Accept: 'text/turtle' } as Headers)\n }\n const response = await store.fetcher?.webOperation('GET', queryURI, options)\n const text = response?.responseText || 'No response text?'\n const report = text.length > 500 ? text.slice(0, 200) + ' ... ' + text.slice(-200) : text\n debug.log(' queryPublicDataConstruct result text:' + report)\n if (text.length === 0) throw new Error('queryPublicDataConstruct: No text back from construct query:' + queryURI)\n parse(text, store, pubicId.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 // const QId = publicDataID.uri.split('/')[4]\n // const dataURI = `http://www.wikidata.org/wiki/Special:EntityData/${QId}.ttl`\n // In fact loading the data URI gives much too much irrelevant data, from wikidata, so we do a query.\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 const headers = new Headers()\n headers.append('Accept', 'text/turtle')\n return kb.fetcher.load(iDToFetch, {\n credentials: 'omit' as 'include' | 'omit' | undefined,\n headers\n })\n }\n}\n\nexport async function getWikidataDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const subjRegexp = /wd:Q49108/g\n const sparql = instituteDetailsWikidataQuery.replace(subjRegexp, publicDataID.toNT())\n await queryPublicDataConstruct(sparql, publicDataID, wikidataParameters)\n debug.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 ?targetClass } # 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.toNT())\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.toNT())\n debug.log(' location query sparql:' + sparql)\n const bindings = await queryPublicDataSelect(sparql, wikidataParameters)\n debug.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 const bindings = await queryPublicDataSelect(sparql, dbpediaParameters)\n loadFromBindings(kb, publicDataID, bindings, publicDataID.doc())\n debug.log('Finished getDbpediaDetails.')\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"publicData.esm.js","names":[],"sources":["../../../../src/widgets/forms/autocomplete/publicData.ts"],"sourcesContent":["/* Logic to access public data stores\n*\n* including filtering resut by natural language etc\n* See https://solidos.solidcommunity.net/public/2021/01%20Building%20Solid%20Apps%20which%20use%20Public%20Data.html\n*/\n\nimport { Literal, NamedNode, parse } from 'rdflib'\nimport { store } from 'solid-logic'\nimport * as debug from '../../../lib/debug'\nimport ns from '../../../lib/ns'\nimport { defaultPreferredLanguages, getPreferredLanguages } from './language'\n\nexport const AUTOCOMPLETE_LIMIT = 200 // How many to get from server\n// With 3000 we could exceed the wikidata timeout\n\nconst subjectRegexp = /\\$\\(subject\\)/g\n\ninterface Term {\n type: string;\n value: string\n}\n\nexport interface 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 limit?: number;\n logo?: NamedNode;\n searchByNameQuery?: string;\n searchByNameURI?: string;\n insitituteDetailsQuery?: string;\n endpoint?: string;\n objectURIBase?: NamedNode;\n targetClass?: NamedNode,\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 ResearchOrganization: 'http://www.wikidata.org/entity/Q31855',\n SportsOrganization: 'http://www.wikidata.org/entity/Q4438121'\n}\n\nexport const instituteDetailsWikidataQuery = `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\nexport const fetcherOptionsJsonPublicData = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // try to avoid CORS problems. Data is public so no auth\n headers: new Headers({ Accept: 'application/json' })\n}\n\nexport const escoParameters:QueryParameters = {\n label: 'ESCO',\n logo: store.sym('https://ec.europa.eu/esco/portal/static_resource2/images/logo/logo_en.gif'),\n searchByNameURI: 'https://ec.europa.eu/esco/api/search?language=$(language)&type=occupation&text=$(name)'\n // endpoint: undefined\n // returnFormat: 'ESCO',\n // targetClass: {}\n}\n\nexport const dbpediaParameters:QueryParameters = {\n label: 'DBPedia',\n logo: store.sym('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 $(targetClass); rdfs:label ?name\n FILTER regex(?name, \"$(name)\", \"i\")\n } LIMIT $(limit)`,\n endpoint: 'https://dbpedia.org/sparql/'\n}\n\nexport const dbPediaTypeMap = { AcademicInsitution: 'http://umbel.org/umbel/rc/EducationalOrganization' }\n\nexport const wikidataOutgoingClassMap = {\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\nexport const wikidataParameters = {\n label: 'WikiData',\n limit: 3000, // Need a high one as very many items, and many languages\n logo: store.sym('https://www.wikimedia.org/static/images/project-logos/wikidatawiki.png'),\n endpoint: 'https://query.wikidata.org/sparql',\n searchByNameQuery: `SELECT ?subject ?name\n WHERE {\n ?klass wdt:P279* $(targetClass) .\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\nexport const wikidataIncomingClassMap = {\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'), // govt agency\n 'http://www.wikidata.org/entity/Q2221906': ns.schema('Place'), // geographic location\n 'http://www.wikidata.org/entity/Q167037': ns.schema('Corporation') // Corporation\n\n}\nexport const variableNameToPredicateMap = { // allow other mappings to be added in theory hence var\n // wikidata:\n targetClass: 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 // dbpedia - :\n city: ns.vcard('locality'),\n state: ns.vcard('region'),\n country: ns.vcard('country-name'),\n homepage: ns.foaf('homepage'),\n lat: ns.schema('latitude'),\n long: ns.schema('longitude')\n}\n\nexport function bindingToTerm (item) {\n const typ = item.type.toLowerCase()\n if (typ === 'uri' || typ === 'iri') {\n return store.sym(item.value)\n } else if (typ === 'literal') {\n if (item['xml:lang']) {\n return new Literal(item.value, item['xml:lang'])\n } else {\n return new Literal(item.value)\n }\n } else {\n throw new Error(`bindingToTerm: Unexpected type \"${item.type}\" in sparql binding}`)\n }\n}\n\nexport function loadFromBindings (kb, solidSubject:NamedNode, bindings, doc, predMap = variableNameToPredicateMap) {\n const results = {}\n debug.log(`loadFromBindings: subject: ${solidSubject}`)\n debug.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 debug.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 (wikidataIncomingClassMap[value]) {\n obj = wikidataIncomingClassMap[value]\n } else {\n debug.warn('Unmapped Wikidata Class: ' + value)\n }\n } else if (key === 'coordinates') {\n // const latlong = value // Like 'Point(-71.106111111 42.375)'\n debug.log(' @@@ hey a point: ' + value)\n // const regexp = /.*\\(([-0-9\\.-]*) ([-0-9\\.-]*)\\)/\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 } else {\n debug.log('Bad coordinates syntax: ' + value)\n }\n } else {\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 debug.log(` public data ${pred} ${obj}.`)\n }\n })\n }\n}\n\n/* ESCO sopecific\n*/\nexport function ESCOResultToBindings (json: Object): Bindings {\n const results = (json as any)._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' }, subject: { type: 'IRI', value: uri } } // simulate SPARQL bindings\n })\n return bindings\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) throw new Error('Missing queryTarget.searchByNameURI on queryESCODataByName')\n const limit = queryTarget.limit || AUTOCOMPLETE_LIMIT\n const queryURI = queryTarget.searchByNameURI\n .replace('$(name)', filter)\n .replace('$(limit)', '' + limit)\n .replace('$(targetClass)', theClass.toNT())\n debug.log('Querying ESCO data - uri: ' + queryURI)\n\n const response = await store.fetcher?.webOperation('GET', queryURI, fetcherOptionsJsonPublicData)\n const text = response?.responseText || ''\n debug.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('Whole JSON return object', json)\n debug.log(' ESCO Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n return ESCOResultToBindings(json)\n}\n\n/* Cope ithe syntax probelm in wikidata timeout responses\n*\n* Wikidata bug: https://phabricator.wikimedia.org/T283962\n* This will not be needed whn that WDQS bug fixed.\n* This is aptured in https://github.com/solidos/solid-ui/issues/403\n*/\nfunction fixWikidataJSON (str) {\n const syntaxProblem = str.indexOf('SPARQL-QUERY')\n if (syntaxProblem < 0) return str\n // console.log('@@ fixWikidataJSON FIXING')\n debug.warn(' ### Fixing JSON with wikidata error code injection ' + str.slice(syntaxProblem, syntaxProblem + 200))\n const goodness = str.lastIndexOf('}, {')\n return str.slice(0, goodness) + ' } ] } } ' // Close binding, array, bindings, results, root object\n}\n/* Query all entities of given class and partially matching name\n*/\nexport async function queryPublicDataByName (\n filter: string,\n theClass:NamedNode,\n languages: Array<string>,\n queryTarget: QueryParameters): Promise<Bindings> {\n function substituteStrings (template: string):string {\n const limit = queryTarget.limit || AUTOCOMPLETE_LIMIT\n const u1 = template.replace('$(name)', filter)\n .replace('$(limit)', '' + limit)\n .replace('$(language)', language)\n return u1.replace('$(targetClass)', theClass.toNT())\n }\n\n if (!theClass) {\n throw new Error('queryPublicDataByName: No class provided')\n }\n\n const languagePrefs = await getPreferredLanguages() || defaultPreferredLanguages\n const language = languagePrefs[0] || 'en'\n if (queryTarget.searchByNameQuery) {\n const sparql = substituteStrings(queryTarget.searchByNameQuery)\n debug.log('Querying public data - sparql: ' + sparql)\n return queryPublicDataSelect(sparql, queryTarget)\n } else if (queryTarget.searchByNameURI) { // not sparql - random API\n const queryURI = substituteStrings(queryTarget.searchByNameURI)\n let response\n try {\n response = await store.fetcher?.webOperation('GET', queryURI, fetcherOptionsJsonPublicData)\n } catch (err) {\n throw new Error(`Exception when trying to fetch ${queryURI} \\n ${err}`)\n }\n const text = response.responseText || '' // ts\n if (response.status !== 200) {\n throw new Error(`HTTP error status ${response.status} trying to fetch ${queryURI} `)\n }\n debug.log(' Query result text' + text.slice(0, 500) + '...')\n if (text.length === 0) throw new Error('queryPublicDataByName: No text back from public data query ' + queryURI)\n const text2 = fixWikidataJSON(text) // Kludge: strip of interrupting error message\n const json = JSON.parse(text2)\n debug.log(' API Query result JSON' + JSON.stringify(json, null, 4).slice(0, 500) + '...')\n if ((json as any)._embedded) {\n debug.log(' Looks like ESCO')\n const bindings = ESCOResultToBindings(json)\n return bindings\n } else {\n alert('Code me: unrecognized API return format')\n throw new Error(`*** Need to add code to parse unrecognized API JSON return\\n${JSON.stringify(json, null, 4)}`)\n }\n } else {\n throw new Error('Query source must have either rest API or SPARQL endpoint.')\n }\n}\n\n/* Query a database using SPARQL SELECT\n*/\nexport async function queryPublicDataSelect (sparql: string, queryTarget: QueryParameters): Promise<Bindings> {\n if (!queryTarget.endpoint) throw new Error('Missing queryTarget.endpoint required for queryPublicDataSelect')\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n debug.log(' queryPublicDataSelect uri: ' + queryURI)\n const headers = new Headers()\n headers.append('Accept', 'application/json')\n const options = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // CORS - as we know it is public\n headers\n }\n\n const response = await store.fetcher?.webOperation('GET', queryURI, options)\n\n const text = response?.responseText || ''\n if (text.length === 0) throw new Error('No text back from query ' + queryURI)\n const text2 = fixWikidataJSON(text)\n const json = JSON.parse(text2)\n debug.log(' Query result JSON' + JSON.stringify(json, null, 4).slice(0, 100) + '...')\n const bindings = json.results.bindings\n return bindings\n}\n\n/* Load from a database using SPARQL CONSTRUCT\n*/\nexport async function queryPublicDataConstruct (sparql: string, pubicId: NamedNode, queryTarget: QueryParameters): Promise<void> {\n debug.log('queryPublicDataConstruct: sparql:', sparql)\n if (!queryTarget.endpoint) throw new Error('Missing queryTarget.endpoint required for queryPublicDataConstruct')\n const myUrlWithParams = new URL(queryTarget.endpoint)\n myUrlWithParams.searchParams.append('query', sparql)\n const queryURI = myUrlWithParams.href\n debug.log(' queryPublicDataConstruct uri: ' + queryURI)\n const headers = new Headers()\n headers.append('Accept', 'text/turtle')\n const options = {\n credentials: 'omit' as 'include' | 'omit' | undefined, // CORS // @tsc pain\n headers // ({ Accept: 'text/turtle' } as Headers)\n }\n const response = await store.fetcher?.webOperation('GET', queryURI, options)\n const text = response?.responseText || 'No response text?'\n const report = text.length > 500 ? text.slice(0, 200) + ' ... ' + text.slice(-200) : text\n debug.log(' queryPublicDataConstruct result text:' + report)\n if (text.length === 0) throw new Error('queryPublicDataConstruct: No text back from construct query:' + queryURI)\n parse(text, store, pubicId.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 // const QId = publicDataID.uri.split('/')[4]\n // const dataURI = `http://www.wikidata.org/wiki/Special:EntityData/${QId}.ttl`\n // In fact loading the data URI gives much too much irrelevant data, from wikidata, so we do a query.\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 const headers = new Headers()\n headers.append('Accept', 'text/turtle')\n return kb.fetcher.load(iDToFetch, {\n credentials: 'omit' as 'include' | 'omit' | undefined,\n headers\n })\n }\n}\n\nexport async function getWikidataDetails (kb, solidSubject:NamedNode, publicDataID:NamedNode) {\n const subjRegexp = /wd:Q49108/g\n const sparql = instituteDetailsWikidataQuery.replace(subjRegexp, publicDataID.toNT())\n await queryPublicDataConstruct(sparql, publicDataID, wikidataParameters)\n debug.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 ?targetClass } # 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.toNT())\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.toNT())\n debug.log(' location query sparql:' + sparql)\n const bindings = await queryPublicDataSelect(sparql, wikidataParameters)\n debug.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 const bindings = await queryPublicDataSelect(sparql, dbpediaParameters)\n loadFromBindings(kb, publicDataID, bindings, publicDataID.doc())\n debug.log('Finished getDbpediaDetails.')\n}\n"],"mappings":"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"}
|