From f0f957e62505d9edb5395b2d6b6bbea334bfb36a Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Mon, 30 Nov 2020 11:12:10 -0500 Subject: [PATCH 01/32] Remove any text transform from buttons; unset text transform for labels, --- src/bfe.js | 4 ++-- src/css/bootstrap-extra.css | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/bfe.js b/src/bfe.js index 34f0e38..6959933 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -4115,10 +4115,10 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' } - var $displaybutton = $(''); + var $displaybutton = $(''); // check for non-blanknode if (bgvars.tlabelURI !== undefined && bgvars.tlabelURI.match('^!_:b')) { - $displaybutton = $(''); + $displaybutton = $(''); } $buttongroup.append($displaybutton); diff --git a/src/css/bootstrap-extra.css b/src/css/bootstrap-extra.css index 09e7a6e..59d2c81 100755 --- a/src/css/bootstrap-extra.css +++ b/src/css/bootstrap-extra.css @@ -29,6 +29,11 @@ a:hover { text-decoration: underline; } +/* Sandstone has buttons that are ALL CAPS. This resets that. */ +.btn { + text-transform: none; +} + /* Change edit button colors for sandstone theme. */ .btn-warning { color: #fff; From b50b063dc78e065e13519b515c2701dc795c6be2 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Mon, 30 Nov 2020 17:57:27 -0500 Subject: [PATCH 02/32] Ensure save after closing modal has all variables it needs to return the data; make sure parent modal remains scrollable. --- src/bfe.js | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/bfe.js b/src/bfe.js index 6959933..81c0243 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -3506,10 +3506,41 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' handle: ".modal-header" }); + // Let's use use good old function sytax + function saveChangesFunc(event, varobj) { + var callingformobjectid = varobj.callingformobjectid; + var form = varobj.form; + + varobj.triples.forEach(function (triple) { + removeTriple(callingformobjectid, inputID, null, triple); + }); + if (form.formobject.store.length <= 2) { + $('#bfeditor-modalSave-' + form.formobject.id).off('click'); + $('#bfeditor-modal-' + form.formobject.id).modal('hide'); + } else { + setResourceFromModal(callingformobjectid, form.formobject.id, resourceURI, form.formobject.defaulturi, varobj.inputID, _.uniq(form.formobject.store)); + bfe.saveNoExit(); + } + } + + var varobj = { + callingformobjectid: callingformobjectid, + triples: triplespassed, + inputID: inputID, + form: form + } + // Assign the listener callback to a variable + var saveChangesTest = (event) => saveChangesFunc(event, varobj); + + //<<< <<<< HEAD // $('#bfeditor-modalSave-' + form.formobject.id).click(function () { //==== === var saveChanges = function () { + var callingformobjectid = this.id.replace("bfeditor-modalSaveHeader-", ""); + callingformobjectid = callingformobjectid.replace("bfeditor-modalSave-", ""); + console.log(callingformobjectid); + // >>>> >>> aws triples.forEach(function (triple) { removeTriple(callingformobjectid, inputID, null, triple); @@ -3552,8 +3583,8 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' bfe.saveNoExit(); } } - $('#bfeditor-modalSave-' + form.formobject.id).click(saveChanges); - $('#bfeditor-modalSaveHeader-' + form.formobject.id).click(saveChanges); + $('#bfeditor-modalSave-' + form.formobject.id).click(saveChangesTest); + $('#bfeditor-modalSaveHeader-' + form.formobject.id).click(saveChangesTest); $('#bfeditor-modalSave-' + form.formobject.id).attr('tabindex', tabIndices++); // >>> >>>> aws @@ -3561,6 +3592,13 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' $(this).empty(); }); + // This ensures any parent modals remain valid and active. + $('#bfeditor-modal-' + form.formobject.id).on('hidden.bs.modal', function () { + if ($('.modal:visible').length) { // check whether parent modal is opend after child modal close + $('body').addClass('modal-open'); // if open mean length is 1 then add a bootstrap css class to body of the page + } + }); + $('.typeahead', form.form).each(function () { setTypeahead(this); }); @@ -3648,6 +3686,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' var lookupLabel; var tsubject = resourceID; + console.log(forms); var callingformobject = _.where(forms, { 'id': formobjectID }); @@ -3663,6 +3702,8 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' 'o': resourcetemplate.resourceURI }; + console.log(callingformobject); + console.log(propertyguid); resourceType.rtID = _.where(callingformobject.resourceTemplates[0].propertyTemplates, { 'guid': propertyguid })[0].valueConstraint.valueTemplateRefs[0]; From 9e3ed8a9eaf4c79f9c7f052aadfab33b44ae055c Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Tue, 1 Dec 2020 17:41:39 -0500 Subject: [PATCH 03/32] If displaydata for provision activity is still empty, return something! --- src/bfe.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bfe.js b/src/bfe.js index 81c0243..dfd39db 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -3102,6 +3102,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' displaydata = exports.labelMaker(pd, property); } + bfelog.addMsg(new Error(), 'DEBUG', 'displayData is: ' + displaydata); if (displaydata === undefined) { if (data !== undefined && data.o !== undefined) { displaydata = data.o; @@ -3975,6 +3976,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' exports.displayDataService = function(labeldata, displaydata){ bfelog.addMsg(new Error(), 'DEBUG', 'labeldata is: ', labeldata); bfelog.addMsg(new Error(), 'DEBUG', 'displaydata is: ' + displaydata); + bfelog.addMsg(new Error(), 'DEBUG', 'NOTE: displaydata is the name of the property basically'); if (displaydata === 'adminMetadata') { var admindisplaydata = ''; @@ -4081,7 +4083,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' if (displaydata != "") { displaydata = displaydata + " - "; } displaydata = displaydata + dateLabel; } - if (dateLabel == "") { + if (displaydata == "" && dateLabel == "") { displaydata = "provisionActivity"; } From a4a3ff0efb5c31df68324f50ef2cc3ea614be32a Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 19 Mar 2021 14:49:27 -0400 Subject: [PATCH 04/32] Added lookups example. Tweaked buildContextFor. Just commited bad profiles URL, which I'll now undo. --- static/js/config-dev.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/static/js/config-dev.js b/static/js/config-dev.js index ad80e90..9312c9b 100755 --- a/static/js/config-dev.js +++ b/static/js/config-dev.js @@ -29,6 +29,12 @@ if (env.BASEDBURI!=undefined) { resourceURI = baseDBURI + "/resources"; workContext = resourceURI + "/works/"; // This is unused? +var lookups = { + 'http://preprod.id.loc.gov/authorities/names': { + 'name': 'LCNAF', + 'require': 'src/lookups/lcnames' + } +}; var config = { "logging": { @@ -45,15 +51,16 @@ var config = { "basedbURI": baseDBURI, "resourceURI": resourceURI, "metaproxyURI": metaproxyURI, + //"lookups": lookups, "buildContext": true, - "buildContextFor": ['id.loc.gov/authorities/names/','id.loc.gov/authorities/subjects/','http://id.loc.gov/authorities/childrensSubjects','id.loc.gov/vocabulary/relators/','id.loc.gov/resources/works/', 'id.loc.gov/bfentities/providers/','id.loc.gov/entities/providers/','id.loc.gov/authorities/genreForms'], + "buildContextFor": ['id.loc.gov/authorities/names','id.loc.gov/authorities/subjects/','http://id.loc.gov/authorities/childrensSubjects','id.loc.gov/vocabulary/relators/','id.loc.gov/resources/works/', 'id.loc.gov/bfentities/providers/','id.loc.gov/entities/providers/','id.loc.gov/authorities/genreForms'], "buildContextForWorksEndpoint": workContext, "enableUserTemplates": true, "enableLoadMarc": true, "startingPointsUrl": "/api/listconfigs?where=index.resourceType:startingPoints&where=index.label:" + name, "literalLangDataUrl": '/api/listconfigs?where=index.resourceType:literalLangData', "profiles": [ - "/api/listconfigs?where=index.resourceType:profile" + "https://preprod-3001.id.loc.gov/api/listconfigs?where=index.resourceType:profile" ], "api": ["save", "publish", "retrieveLDS", "retrieve", "deleteId", "setStartingPoints"], "return": { From 95feb5dabfe1f7f7da883020f05e67da6773f347 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 19 Mar 2021 14:50:21 -0400 Subject: [PATCH 05/32] Profiles URL back to normla. --- static/js/config-dev.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/js/config-dev.js b/static/js/config-dev.js index 9312c9b..94c5556 100755 --- a/static/js/config-dev.js +++ b/static/js/config-dev.js @@ -60,7 +60,7 @@ var config = { "startingPointsUrl": "/api/listconfigs?where=index.resourceType:startingPoints&where=index.label:" + name, "literalLangDataUrl": '/api/listconfigs?where=index.resourceType:literalLangData', "profiles": [ - "https://preprod-3001.id.loc.gov/api/listconfigs?where=index.resourceType:profile" + "/api/listconfigs?where=index.resourceType:profile" ], "api": ["save", "publish", "retrieveLDS", "retrieve", "deleteId", "setStartingPoints"], "return": { From bcf789ec26e7658a77d9926dc929016440c47dce Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 19 Mar 2021 14:52:28 -0400 Subject: [PATCH 06/32] Added names-preprod include --- development.html | 1 + editor-dev.html | 1 + fulleditor-dev.html | 1 + test.html | 1 + 4 files changed, 4 insertions(+) diff --git a/development.html b/development.html index 6b14080..0cc761c 100755 --- a/development.html +++ b/development.html @@ -66,6 +66,7 @@ + diff --git a/editor-dev.html b/editor-dev.html index 8c17b81..04376f3 100644 --- a/editor-dev.html +++ b/editor-dev.html @@ -55,6 +55,7 @@ + diff --git a/fulleditor-dev.html b/fulleditor-dev.html index ce879b9..b93316e 100644 --- a/fulleditor-dev.html +++ b/fulleditor-dev.html @@ -55,6 +55,7 @@ + diff --git a/test.html b/test.html index 99f9b70..32c461a 100755 --- a/test.html +++ b/test.html @@ -66,6 +66,7 @@ + From cc1c01813e8a895e936ebd5453a691ba2d0f98bc Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 19 Mar 2021 14:56:15 -0400 Subject: [PATCH 07/32] Added names-preprod lookup. --- Gruntfile.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index a6a6bb3..04323a8 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -8,13 +8,13 @@ module.exports = function(grunt) { }, test: { files: { - 'builds/bfe-test.js' : ['src/lib/mini_require.js', 'src/bfe.js','src/bfestore.js','src/bfelogging.js','src/bfeusertemplates.js','src/bfeliterallang.js','src/bfelookups.js', 'src/bfelabels.js', 'src/bfeapi.js','src/lib/aceconfig.js'], + 'builds/bfe-test.js' : ['src/lib/mini_require.js', 'src/bfe.js','src/bfestore.js','src/bfelogging.js','src/bfeusertemplates.js','src/bfeliterallang.js','src/bfelookups.js', 'src/lookups/names-preprod.js', 'src/bfelabels.js', 'src/bfeapi.js','src/lib/aceconfig.js'], 'builds/bfe-test.css' : ['src/css/bootstrap-extra.css', 'src/css/typeahead.css', 'src/css/bfeusertemplates.css', 'src/css/bfeliterallang.css'], } }, dist: { files: { - 'builds/bfe.js' : ['src/lib/mini_require.js', 'src/bfe.js','src/bfestore.js','src/bfelogging.js','src/bfeusertemplates.js','src/bfeliterallang.js','src/bfelookups.js', 'src/bfelabels.js', 'src/bfeapi.js','src/lib/aceconfig.js'], + 'builds/bfe.js' : ['src/lib/mini_require.js', 'src/bfe.js','src/bfestore.js','src/bfelogging.js','src/bfeusertemplates.js','src/bfeliterallang.js','src/bfelookups.js', 'src/lookups/names-preprod.js', 'src/bfelabels.js', 'src/bfeapi.js','src/lib/aceconfig.js'], 'builds/bfe.css' : ['src/css/bootstrap-extra.css', 'src/css/typeahead.css', 'src/css/bfeusertemplates.css', 'src/css/bfeliterallang.css'], } }, From 3b48a8c3f825e6bbb0c31483547f68ac057e6253 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 19 Mar 2021 14:56:39 -0400 Subject: [PATCH 08/32] New names-preprod lookup. --- src/lookups/names-preprod.js | 91 ++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/lookups/names-preprod.js diff --git a/src/lookups/names-preprod.js b/src/lookups/names-preprod.js new file mode 100644 index 0000000..9cafeb3 --- /dev/null +++ b/src/lookups/names-preprod.js @@ -0,0 +1,91 @@ +bfe.define('src/lookups/lcnames-preprod', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + var lcshared = require('src/lookups/lcshared'); + var bfelog = require('src/bfelogging'); + var cache = {}; + + // This var is required because it is used as an identifier. + exports.scheme = 'http://preprod.id.loc.gov/authorities/names'; + + exports.source = function (query, processSync, processAsync, formobject) { + var triples = formobject.store; + + var type = ''; + var hits = _.where(triples, { + 's': formobject.defaulturi, + 'p': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' + }); + if (hits[0] !== undefined) { + type = hits[0].o; + } + + var scheme = exports.scheme; + + var rdftype = lcshared.rdfType(type); + + var q = ''; + if (scheme !== '' && rdftype !== '') { + q = '&cs:' + scheme + '&rdftype=' + rdftype; + } else if (rdftype !== '') { + q = '&rdftype=' + rdftype; + } else if (scheme !== '') { + q = '&cs:' + scheme; + } + if (q !== '') { + q = '(' + query + ' OR ' + query + '* OR *' + query + '*)' + q; + } else { + q = '(' + query + ' OR ' + query + '* OR *' + query + '*)'; + } + // console.log('q is ' + q); + q = encodeURI(q); + + if (cache[q]) { + processSync(cache[q]); + return; + } + if (typeof this.searching !== 'undefined') { + clearTimeout(this.searching); + processSync([]); + } + + var schemeBaseURL = exports.scheme.split('/').slice(0,3).join('/'); + + this.searching = setTimeout(function () { + if (query.length > 2 && query.substr(0, 1) != '?' && !query.match(/^[Nn][A-z\s]{0,1}\d/)) { + var suggestquery = query.normalize(); + bfelog.addMsg(new Error(), 'INFO',query); + if (rdftype !== '') { suggestquery += '&rdftype=' + rdftype.replace('rdftype:', ''); } + + var u = exports.scheme + '/suggest/?q=' + suggestquery + '&count=50'; + u = u.replace(/^(http:)/,""); + $.ajax({ + url: u, + dataType: 'jsonp', + success: function (data) { + var parsedlist = lcshared.processSuggestions(data, query); + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } else if (query.length > 2) { + if (query.match(/^[Nn][A-z\s]{0,1}\d/)){ + q = query.replace(/\s+/g,'').normalize(); + } + u = schemeBaseURL + '/search/?format=jsonp&start=1&count=50&q=' + q.replace('?', ''); + u = u.replace(/^(http:)/,""); + $.ajax({ + url: u, + dataType: 'jsonp', + success: function (data) { + var parsedlist = lcshared.processATOM(data, query); + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } else { + return []; + } + }, 300); // 300 ms + }; + + exports.getResource = lcshared.getResource; + }); \ No newline at end of file From b4a6d2751cc01da0b5a909e1142aee5253c7c5c2 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 19 Mar 2021 14:59:48 -0400 Subject: [PATCH 09/32] Alter fetchContextData to allow other id.loc.gov URLs and to replace http with https if ID. --- src/bfelookups.js | 52 ++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/src/bfelookups.js b/src/bfelookups.js index 4f01406..f4d8a4c 100644 --- a/src/bfelookups.js +++ b/src/bfelookups.js @@ -379,29 +379,32 @@ bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', exports.fetchContextData = function(uri,callback){ - if (uri.startsWith('http://id.loc.gov') && uri.match(/(authorities|vocabulary)/)) { - var jsonuri = uri + '.madsrdf_raw.jsonld'; - jsonuri = jsonuri.replace(/^(http:)/,"https:"); - } else { - jsonuri = uri + '.jsonld'; - } + if (uri.indexOf('id.loc.gov/') > -1 && uri.match(/(authorities|vocabulary)/)) { + var jsonuri = uri + '.madsrdf_raw.jsonld'; + } else { + jsonuri = uri + '.jsonld'; + } + + if (uri.indexOf('id.loc.gov') > -1) { + jsonuri = jsonuri.replace(/^(http:)/,"https:"); + } - $.ajax({ - url: jsonuri, - dataType: 'json', - success: function (data) { - - var id = uri.split('/')[uri.split('/').length-1]; - data.uri = uri; + $.ajax({ + url: jsonuri, + dataType: 'json', + success: function (data) { + + var id = uri.split('/')[uri.split('/').length-1]; + data.uri = uri; - var d = JSON.stringify(exports.extractContextData(data)); - sessionStorage.setItem(id, d); - if (callback){ - callback(d) - } - } - }); + var d = JSON.stringify(exports.extractContextData(data)); + sessionStorage.setItem(id, d); + if (callback){ + callback(d) + } + } + }); }; exports.rdfType = function(type){ @@ -432,13 +435,6 @@ bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', exports.processSuggestions = function (suggestions, query) { - // was trying to pre-fetch some of the results, just causes a lot of slow down, not really needed - // suggestions[3].forEach(function(v,i){ - // if (i<=10){ - // exports.fetchContextData(v) - // } - // }); - var typeahead_source = []; if (suggestions[1] !== undefined) { for (var s = 0; s < suggestions[1].length; s++) { @@ -504,7 +500,7 @@ bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', }); break; } - bfelog.addMsg(new Error(), 'INFO',typeahead_source); + bfelog.addMsg(new Error(), 'INFO', typeahead_source); } } } From 41fc3e37b4be7165cbcf89ac88f81798bbaba114 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 19 Mar 2021 15:02:04 -0400 Subject: [PATCH 10/32] Use URI base for context-data lookups; added names-preprod to config. --- src/bfe.js | 48 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/src/bfe.js b/src/bfe.js index dfd39db..38dbcfd 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -51,6 +51,10 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' 'name': 'LCNAF', 'load': require('src/lookups/lcnames') }, + 'http://preprod.id.loc.gov/authorities/names': { + 'name': 'LCNAF', + 'load': require('src/lookups/lcnames-preprod') + }, 'http://id.loc.gov/rwo/agents': { 'name': 'LC-Agents', 'load': require('src/lookups/agents') @@ -207,6 +211,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' }); } + /* if (config.lookups !== undefined) { loadtemplatesANDlookupsCount = loadtemplatesANDlookupsCount + Object.keys(config.lookups).length; config.lookups.foreach(function (lu) { @@ -216,6 +221,15 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' }); }); } + */ + if (config.lookups !== undefined) { + for (const k in config.lookups) { + var lu = config.lookups[k]; + bfelog.addMsg(new Error(), 'INFO', 'Loading lookup: ' + lu.require); + lu.load = require(lu.require); + } + Object.assign(lookups, config.lookups); + } if (editorconfig.baseURI === undefined) { editorconfig.baseURI = window.location.protocol + '//' + window.location.host + '/'; } @@ -3687,7 +3701,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' var lookupLabel; var tsubject = resourceID; - console.log(forms); + //console.log(forms); var callingformobject = _.where(forms, { 'id': formobjectID }); @@ -3703,8 +3717,8 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' 'o': resourcetemplate.resourceURI }; - console.log(callingformobject); - console.log(propertyguid); + //console.log(callingformobject); + //console.log(propertyguid); resourceType.rtID = _.where(callingformobject.resourceTemplates[0].propertyTemplates, { 'guid': propertyguid })[0].valueConstraint.valueTemplateRefs[0]; @@ -4370,13 +4384,14 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' bfelog.addMsg(new Error(), 'DEBUG', 'Lookup is', lu); var dshash = {}; + dshash.scheme = uvf; dshash.name = lu.name; dshash.source = function (query, sync, async) { lu.load.source(query, sync, async, formobject); }; dshash.limit = 50; dshash.templates = { - header: '

' + lu.name + '

', + header: '

' + lu.name + '

', footer: '' }; // dshash.displayKey = (dshash.name.match(/^LCNAF|^LCSH/)) ? 'display' : 'value'; @@ -4391,7 +4406,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' displayKey: 'value' }; if (dshashes.length === 1) { - console.log(dshashes[0]); + //console.log(dshashes[0]); $(input).typeahead( opts, dshashes[0] @@ -4565,12 +4580,16 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' /* e-s-lint complains about the unused vars. But I think they're legitly expected? */ /* eslint-disable no-unused-vars */ $(input).on('typeahead:render', function (event, suggestions, asyncFlag, dataset) { - //bfelog.addMsg(new Error(), 'DEBUG', event, suggestions, asyncFlag, dataset); - + //bfelog.addMsg(new Error(), 'DEBUG', this); if (editorconfig.buildContext) { + + var propertyguid = dataset.propertyguid; + bfelog.addMsg(new Error(), 'DEBUG', 'propertyguid for typeahead input is ' + propertyguid); $('.tt-suggestion').each(function (i, v) { v = $(v); + // console.log(v); + // already has been tooltipterized if (v.hasClass('tooltipstered')) { return true @@ -4616,11 +4635,16 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' } else { - var useUri = $instance.data('ttSelectableObject').uri; - if (useUri.indexOf('id.loc.gov/resources/works/') > -1 && !_.isEmpty(editorconfig.buildContextForWorksEndpoint)) { - useUri = useUri.replace('http://id.loc.gov/resources/works/', editorconfig.buildContextForWorksEndpoint); - } - lcshared.fetchContextData(useUri, function (data) { + var suggestitem_scheme = v[0].parentNode.firstChild.dataset.scheme + var suggestitem_schemeBaseURL = suggestitem_scheme.split('/').slice(0,3).join('/'); + var useUri = $instance.data('ttSelectableObject').uri; + if (useUri.indexOf('id.loc.gov/resources/works/') > -1 && !_.isEmpty(editorconfig.buildContextForWorksEndpoint)) { + useUri = useUri.replace('http://id.loc.gov/resources/works/', editorconfig.buildContextForWorksEndpoint); + } else if ( suggestitem_scheme.indexOf('id.loc.gov/') > -1 && useUri.indexOf('http://id.loc.gov') > -1) { + var schemeBaseURL = suggestitem_scheme.split('/').slice(0,3).join('/'); + useUri = useUri.replace('http://id.loc.gov', suggestitem_schemeBaseURL); + } + lcshared.fetchContextData(useUri, function (data) { // call the 'content' method to update the content of our tooltip with the returned data. // note: this content update will trigger an update animation (see the updateAnimation option) From c97646d0020dd8f51811f0da4bf0e62a3288d765 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Tue, 23 Mar 2021 17:22:14 -0400 Subject: [PATCH 11/32] Display source for fields that use rdf:value. DIsplay type for rdf:value values if no other qualifier or source is available. --- src/bfe.js | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/bfe.js b/src/bfe.js index 38dbcfd..4057e76 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -3299,14 +3299,37 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' displaydata = label; }); } else { + var source = _.find(labeldata, { + s: tvalue.s, + p: 'http://id.loc.gov/ontologies/bibframe/source' + }); + if (!_.isEmpty(source) && !_.isEmpty(source.o)) { + var sourceLabel = _.find(bfestore.store, { + s: source.o, + p: 'http://www.w3.org/2000/01/rdf-schema#label' + }); + if (!_.isEmpty(sourceLabel) && !_.isEmpty(sourceLabel.o)) { + sourceLabel = sourceLabel.o; + } else { + sourceLabel = undefined; + } + } var qualifier = _.find(labeldata, { s: tvalue.s, p: 'http://id.loc.gov/ontologies/bibframe/qualifier' }); + var type = _.find(labeldata, { + s: tvalue.s, + p: 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' + }); + displaydata = tvalue.o; if (!_.isEmpty(qualifier) && !_.isEmpty(qualifier.o)) { - displaydata = tvalue.o + ' ' + qualifier.o; - } else { - displaydata = tvalue.o; + displaydata += ' ' + qualifier.o; + } else if (sourceLabel != undefined) { + displaydata += ' (' + sourceLabel + ')'; + } else if (!_.isEmpty(type) && !_.isEmpty(type.o)) { + var tparts = type.o.split('/'); + displaydata += ' (' + tparts[tparts.length - 1] + ')'; } } From 6c33b48d650dc04db363d6096b716b4e6430e1cc Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Wed, 31 Mar 2021 17:27:26 -0400 Subject: [PATCH 12/32] Move lcshared into own file. Code readability. Hooking it all up. --- Gruntfile.js | 49 +++- development.html | 1 + editor-dev.html | 3 +- fulleditor-dev.html | 3 +- src/bfelookups.js | 562 --------------------------------------- src/lookups/lcshared.js | 563 ++++++++++++++++++++++++++++++++++++++++ test.html | 3 + 7 files changed, 616 insertions(+), 568 deletions(-) create mode 100644 src/lookups/lcshared.js diff --git a/Gruntfile.js b/Gruntfile.js index 04323a8..a6a1407 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -8,14 +8,55 @@ module.exports = function(grunt) { }, test: { files: { - 'builds/bfe-test.js' : ['src/lib/mini_require.js', 'src/bfe.js','src/bfestore.js','src/bfelogging.js','src/bfeusertemplates.js','src/bfeliterallang.js','src/bfelookups.js', 'src/lookups/names-preprod.js', 'src/bfelabels.js', 'src/bfeapi.js','src/lib/aceconfig.js'], - 'builds/bfe-test.css' : ['src/css/bootstrap-extra.css', 'src/css/typeahead.css', 'src/css/bfeusertemplates.css', 'src/css/bfeliterallang.css'], + 'builds/bfe-test.js' : [ + 'src/lib/mini_require.js', + 'src/bfe.js','src/bfestore.js', + 'src/bfelogging.js', + 'src/bfeusertemplates.js', + 'src/bfeliterallang.js', + + 'src/lookups/lcshared.js', + 'src/bfelookups.js', + 'src/lookups/names-preprod.js', + + 'src/bfelabels.js', + 'src/bfeapi.js', + 'src/lib/aceconfig.js' + ], + + 'builds/bfe-test.css' : [ + 'src/css/bootstrap-extra.css', + 'src/css/typeahead.css', + 'src/css/bfeusertemplates.css', + 'src/css/bfeliterallang.css' + ], } }, dist: { files: { - 'builds/bfe.js' : ['src/lib/mini_require.js', 'src/bfe.js','src/bfestore.js','src/bfelogging.js','src/bfeusertemplates.js','src/bfeliterallang.js','src/bfelookups.js', 'src/lookups/names-preprod.js', 'src/bfelabels.js', 'src/bfeapi.js','src/lib/aceconfig.js'], - 'builds/bfe.css' : ['src/css/bootstrap-extra.css', 'src/css/typeahead.css', 'src/css/bfeusertemplates.css', 'src/css/bfeliterallang.css'], + 'builds/bfe.js' : [ + 'src/lib/mini_require.js', + 'src/bfe.js', + 'src/bfestore.js', + 'src/bfelogging.js', + 'src/bfeusertemplates.js', + 'src/bfeliterallang.js', + + 'src/lookups/lcshared.js', + 'src/bfelookups.js', + 'src/lookups/names-preprod.js', + + 'src/bfelabels.js', + 'src/bfeapi.js', + 'src/lib/aceconfig.js' + ], + + 'builds/bfe.css' : [ + 'src/css/bootstrap-extra.css', + 'src/css/typeahead.css', + 'src/css/bfeusertemplates.css', + 'src/css/bfeliterallang.css' + ], } }, }, diff --git a/development.html b/development.html index 0cc761c..8d30ced 100755 --- a/development.html +++ b/development.html @@ -65,6 +65,7 @@ + diff --git a/editor-dev.html b/editor-dev.html index 04376f3..3856211 100644 --- a/editor-dev.html +++ b/editor-dev.html @@ -51,9 +51,10 @@ - + + diff --git a/fulleditor-dev.html b/fulleditor-dev.html index b93316e..6533403 100644 --- a/fulleditor-dev.html +++ b/fulleditor-dev.html @@ -51,9 +51,10 @@ - + + diff --git a/src/bfelookups.js b/src/bfelookups.js index f4d8a4c..96294f3 100644 --- a/src/bfelookups.js +++ b/src/bfelookups.js @@ -96,569 +96,7 @@ bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', */ exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/lcshared', ['require', 'exports', 'src/bfelogging'], function (require, exports) { - // require('https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.js'); - - /* - subjecturi propertyuri selected.uri - selected.uri bf:label selected.value - */ - var bfelog = require('src/bfelogging'); - - exports.getResource = function (subjecturi, property, selected, process) { - var triples = []; - var triple = {}; - if (selected.id == 'literalLookup'){ - triple.s = subjecturi; - triple.p = property.propertyURI; - triple.o = selected.value; - triple.otype = 'literal'; - triples.push(triple); - } else if (selected.id == 'literal'){ - triple.s = subjecturi; - triple.p = 'http://www.w3.org/2000/01/rdf-schema#label'; - triple.o = selected.value; - triple.otype = 'literal'; - triples.push(triple); - } else { - triple.s = subjecturi; - triple.p = property.propertyURI; - triple.o = selected.uri; - triple.otype = 'uri'; - triples.push(triple); - - triple = {}; - triple.s = selected.uri; - triple.p = 'http://www.w3.org/2000/01/rdf-schema#label'; - triple.o = selected.value; - triple.otype = 'literal'; - //triple.olang = 'en'; - triples.push(triple); - } - - return process(triples, property); - }; - - exports.getResourceLabelLookup = function (subjecturi, propertyuri, selected, process) { - var triples = []; - - var triple = {}; - triple.s = subjecturi; - triple.p = propertyuri; - triple.o = selected.uri; - triple.otype = 'uri'; - triples.push(triple); - // add label - var url = selected.uri.replace(/^(http:)/,""); - $.ajax({ - url: url + '.jsonp', - dataType: 'jsonp', - success: function (data) { - data.forEach(function (resource) { - if (resource['@id'] === selected.uri) { - var label = {}; - label.s = selected.uri; - label.otype = 'literal'; - label.p = 'http://www.w3.org/2000/01/rdf-schema#label'; - label.o = resource['http://www.loc.gov/mads/rdf/v1#authoritativeLabel'][0]['@value']; - triples.push(label); - return process(triples); - } - }); - } - }); - }; - - exports.processJSONLDSuggestions = function (suggestions, query, scheme) { - var typeahead_source = []; - if (suggestions['@graph'] !== undefined) { - for (var s = 0; s < suggestions['@graph'].length; s++) { - if (suggestions['@graph'][s].inScheme !== undefined) { - if (suggestions['@graph'][s]['@type'] === 'Concept' && suggestions['@graph'][s].inScheme === scheme) { - if (suggestions['@graph'][s].prefLabel.en.length !== undefined) { - var l = suggestions['@graph'][s].prefLabel.en; - // break; - // var l = suggestions['@graph'][s]['prefLabel']['@value']; - } - var u = suggestions['@graph'][s]['@id']; - typeahead_source.push({ - uri: u, - value: l - }); - } - } - } - } - if (typeahead_source.length === 0) { - typeahead_source[0] = { - uri: '', - value: '[No suggestions found for ' + query + '.]' - }; - } - exports.addLiteralOption(typeahead_source, query); - return typeahead_source; - }; - - exports.processQASuggestions = function (suggestions, query) { - var typeahead_source = []; - if (suggestions[1] !== undefined) { - for (var s = 0; s < suggestions.length; s++) { - var l = suggestions[s]["label"]; - var u = suggestions[s]["uri"]; - var id = suggestions[s]["id"]; - var d = l + ' (' + id + ')'; - - typeahead_source.push({ - uri: u, - id: id, - value: l, - display: d - }); - } - } - if (typeahead_source.length === 0) { - typeahead_source[0] = { - uri: '', - display: '[No suggestions found for ' + query + '.]' - }; - } - exports.addLiteralOption(typeahead_source, query); - - return typeahead_source; - }; - - exports.processNoteTypeSuggestions = function (suggestions, query) { - var typeahead_source = []; - var substrMatch = new RegExp('^' + query, 'i'); - if (suggestions[0].json !== undefined) { - for (var s = 0; s < suggestions[0].json.length; s++) { - var l = suggestions[0].json[s]; - - if(substrMatch.test(l) || _.isEmpty(query)){ - typeahead_source.push({ - uri: "", - id: 'literalLookup', - value: l, - display: l - }); - } - } - } - if (typeahead_source.length === 0) { - typeahead_source[0] = { - uri: '', - display: '[No suggestions found for ' + query + '.]' - }; - } - exports.addLiteralOption(typeahead_source, query); - - return typeahead_source; - }; - - exports.addLiteralOption = function (data, query){ - data.push({uri: "_:b1", id: "literal", value: query, display: query + "(Literal Value)"}); - } - - exports.extractContextData = function(data){ - var results = { source: [], variant : [], uri: data.uri, title: null, contributor:[], date:null, genreForm: null, nodeMap:{}}; - - // if it is in jsonld format - if (data['@graph']){ - data = data['@graph']; - } - - var nodeMap = {}; - - data.forEach(function(n){ - if (n['http://www.loc.gov/mads/rdf/v1#birthDate']){ - nodeMap.birthDate = n['http://www.loc.gov/mads/rdf/v1#birthDate'].map(function(d){ return d['@id']}) - } - if (n['http://www.loc.gov/mads/rdf/v1#birthPlace']){ - nodeMap.birthPlace = n['http://www.loc.gov/mads/rdf/v1#birthPlace'].map(function(d){ return d['@id']}) - } - if (n['http://www.loc.gov/mads/rdf/v1#associatedLocale']){ - nodeMap.associatedLocale = n['http://www.loc.gov/mads/rdf/v1#associatedLocale'].map(function(d){ return d['@id']}) - } - if (n['http://www.loc.gov/mads/rdf/v1#fieldOfActivity']){ - nodeMap.fieldOfActivity = n['http://www.loc.gov/mads/rdf/v1#fieldOfActivity'].map(function(d){ return d['@id']}) - } - if (n['http://www.loc.gov/mads/rdf/v1#gender']){ - nodeMap.gender = n['http://www.loc.gov/mads/rdf/v1#gender'].map(function(d){ return d['@id']}) - } - if (n['http://www.loc.gov/mads/rdf/v1#occupation']){ - nodeMap.occupation = n['http://www.loc.gov/mads/rdf/v1#occupation'].map(function(d){ return d['@id']}) - } - if (n['http://www.loc.gov/mads/rdf/v1#associatedLanguage']){ - nodeMap.associatedLanguage = n['http://www.loc.gov/mads/rdf/v1#associatedLanguage'].map(function(d){ return d['@id']}) - } - if (n['http://www.loc.gov/mads/rdf/v1#deathDate']){ - nodeMap.deathDate = n['http://www.loc.gov/mads/rdf/v1#deathDate'].map(function(d){ return d['@id']}) - } - if (n['http://www.loc.gov/mads/rdf/v1#hasBroaderAuthority']){ - nodeMap.hasBroaderAuthority = n['http://www.loc.gov/mads/rdf/v1#hasBroaderAuthority'].map(function(d){ return d['@id']}) - } - if (n['http://www.loc.gov/mads/rdf/v1#hasNarrowerAuthority']){ - nodeMap.hasNarrowerAuthority = n['http://www.loc.gov/mads/rdf/v1#hasNarrowerAuthority'].map(function(d){ return d['@id']}) - } - - }) - // pull out the labels - data.forEach(function(n){ - - // loop through all the possible types of row - Object.keys(nodeMap).forEach(function(k){ - if (!results.nodeMap[k]) { results.nodeMap[k] = [] } - // loop through each uri we have for this type - nodeMap[k].forEach(function(uri){ - if (n['@id'] && n['@id'] == uri){ - - if (n['http://www.loc.gov/mads/rdf/v1#authoritativeLabel']){ - n['http://www.loc.gov/mads/rdf/v1#authoritativeLabel'].forEach(function(val){ - if (val['@value']){ - results.nodeMap[k].push(val['@value']); - } - }) - } - if (n['http://www.w3.org/2000/01/rdf-schema#label']){ - n['http://www.w3.org/2000/01/rdf-schema#label'].forEach(function(val){ - if (val['@value']){ - results.nodeMap[k].push(val['@value']); - } - }) - } - } - }) - }) - }) - - data.forEach(function(n){ - - var citation = ''; - var variant = ''; - - if (n['http://www.loc.gov/mads/rdf/v1#citation-source']) { - citation = citation + n['http://www.loc.gov/mads/rdf/v1#citation-source'].map(function (v) { return v['@value'] + ' '; }) - } - if (n['http://www.loc.gov/mads/rdf/v1#citation-note']) { - citation = citation + n['http://www.loc.gov/mads/rdf/v1#citation-note'].map(function (v) { return v['@value'] + ' '; }) - } - if (n['http://www.loc.gov/mads/rdf/v1#citation-status']) { - citation = citation + n['http://www.loc.gov/mads/rdf/v1#citation-status'].map(function (v) { return v['@value'] + ' '; }) - } - if (n['http://www.loc.gov/mads/rdf/v1#variantLabel']) { - variant = variant + n['http://www.loc.gov/mads/rdf/v1#variantLabel'].map(function (v) { return v['@value'] + ' '; }) - } - citation = citation.trim() - variant = variant.trim() - if (variant != ''){ results.variant.push(variant)} - if (citation != ''){ results.source.push(citation)} - - - if (n['@type'] && n['@type'] == 'http://id.loc.gov/ontologies/bibframe/Title'){ - if (n['bibframe:mainTitle']){ - results.title = n['bibframe:mainTitle'] - } - } - if (n['@type'] && (n['@type'] == 'http://id.loc.gov/ontologies/bibframe/Agent' || n['@type'].indexOf('http://id.loc.gov/ontologies/bibframe/Agent') > -1 )){ - if (n['bflc:name00MatchKey']){ - results.contributor.push(n['bflc:name00MatchKey']); - } - } - if (n['bibframe:creationDate'] && n['bibframe:creationDate']['@value']){ - results.date = n['bibframe:creationDate']['@value']; - } - if (n['@type'] && n['@type'] == 'http://id.loc.gov/ontologies/bibframe/GenreForm'){ - if (n['bibframe:mainTitle']){ - results.genreForm = n['rdf-schema:label']; - } - } - }); - return results; - } - - exports.fetchContextData = function(uri,callback){ - - if (uri.indexOf('id.loc.gov/') > -1 && uri.match(/(authorities|vocabulary)/)) { - var jsonuri = uri + '.madsrdf_raw.jsonld'; - } else { - jsonuri = uri + '.jsonld'; - } - - if (uri.indexOf('id.loc.gov') > -1) { - jsonuri = jsonuri.replace(/^(http:)/,"https:"); - } - - - $.ajax({ - url: jsonuri, - dataType: 'json', - success: function (data) { - - var id = uri.split('/')[uri.split('/').length-1]; - data.uri = uri; - - var d = JSON.stringify(exports.extractContextData(data)); - sessionStorage.setItem(id, d); - if (callback){ - callback(d) - } - } - }); - }; - - exports.rdfType = function(type){ - var rdftype = ''; - if (type == 'http://www.loc.gov/mads/rdf/v1#PersonalName' || type == 'http://id.loc.gov/ontologies/bibframe/Person') { - rdftype = 'rdftype:PersonalName'; - } else if (type == 'http://id.loc.gov/ontologies/bibframe/Topic') { - rdftype = '(rdftype:Topic OR rdftype:ComplexSubject)'; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Place' || type == 'http://id.loc.gov/ontologies/bibframe/Place' || type == 'http://www.loc.gov/mads/rdf/v1#Geographic') { - rdftype = 'rdftype:Geographic'; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Temporal'){ - rdftype= 'rdftype:Temporal'; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Organization' || type == 'http://id.loc.gov/ontologies/bibframe/Organization') { - rdftype = 'rdftype:CorporateName'; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Family' || type == 'http://id.loc.gov/ontologies/bibframe/Family') { - rdftype = "rdftype:FamilyName"; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Meeting' || type == 'http://id.loc.gov/ontologies/bibframe/Meeting') { - rdftype = 'rdftype:ConferenceName'; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Jurisdiction' || type == 'http://id.loc.gov/ontologies/bibframe/Jurisdiction') { - rdftype = 'rdftype:Geographic'; - } else if (type == 'http://id.loc.gov/ontologies/bibframe/GenreForm' || type == 'http://www.loc.gov/mads/rdf/v1#GenreForm') { - rdftype = 'rdftype:GenreForm'; - } else if (type == 'http://id.loc.gov/ontologies/bibframe/Role') { - rdftype = 'rdftype:Role'; - } - return rdftype; - } - - exports.processSuggestions = function (suggestions, query) { - - var typeahead_source = []; - if (suggestions[1] !== undefined) { - for (var s = 0; s < suggestions[1].length; s++) { - var l = suggestions[1][s]; - var u = suggestions[3][s]; - var id = u.replace(/.+\/(.+)/, '$1'); - if (id.length==32){ - var d = l; - }else{ - d = l + ' (' + id + ')'; - } - - if (suggestions.length === 5) { - var i = suggestions[4][s]; - var li = l + ' (' + i + ')'; - } else { - li = l; - } - - typeahead_source.push({ - uri: u, - id: id, - value: li, - display: d - }); - } - } - if (typeahead_source.length === 0) { - typeahead_source[0] = { - uri: '', - display: '[No suggestions found for ' + query + '.]' - }; - } - exports.addLiteralOption(typeahead_source, query); - - return typeahead_source; - }; - - exports.processATOM = function (atomjson, query) { - var typeahead_source = []; - for (var k in atomjson) { - if (atomjson[k][0] == 'atom:entry') { - var t = ''; - var u = ''; - var source = ''; - var d = ''; - for (var e in atomjson[k]) { - if (atomjson[k][e][0] == 'atom:title') { - t = atomjson[k][e][2]; - } - if (atomjson[k][e][0] == 'atom:link') { - u = atomjson[k][e][1].href; - source = u.substr(0, u.lastIndexOf('/')); - var id = u.replace(/.+\/(.+)/, '$1'); - d = t + ' (' + id + ')'; - } - if (t !== '' && u !== '') { - typeahead_source.push({ - uri: u, - source: source, - value: t, - display: d - }); - break; - } - bfelog.addMsg(new Error(), 'INFO', typeahead_source); - } - } - } - if (typeahead_source.length === 0) { - typeahead_source[0] = { - uri: '', - display: '[No suggestions found for ' + query + '.]' - }; - } - // console.log(typeahead_source); - return typeahead_source; - }; - - exports.simpleQuery = function (query, cache, scheme, processSync, processAsync) { - return exports.complexQuery (query, cache, scheme, "ID" , processSync, processAsync, null) - } - - exports.complexQuery = function (query, cache, scheme, resultType, processSync, processAsync, formobject) { - bfelog.addMsg(new Error(), 'INFO','q is ' + query); - - if (!_.isEmpty(formobject)){ - var triples = formobject.store; - - var type = ''; - var hits = _.where(triples, { - 'p': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' - }); - if (hits[0] !== undefined) { - type = hits[0].o; - } - - var rdftype = exports.rdfType(type); - var q = ''; - if (scheme !== '' && rdftype !== '') { - q = 'cs:' + scheme + ' AND ' + rdftype; - } else if (rdftype !== '') { - q = rdftype; - } else if (scheme !== '') { - q = 'cs:' + scheme; - } - - if (q !== '') { - q = q + ' AND ' + query.replace('?', '').normalize() + '*'; - } else { - q = query.normalize(); - } - } else { - q = query.normalize(); - } - - if (cache[q]) { - processSync(cache[q]); - return; - } - if (typeof this.searching !== 'undefined') { - clearTimeout(this.searching); - processSync([]); - } - this.searching = setTimeout(function () { - if (resultType == "NoteType") { - u = config.url + "/profile-edit/server/whichrt?uri=" + scheme; - $.ajax({ - url: encodeURI(u), - dataType: 'json', - success: function (data) { - var parsedlist = exports.processNoteTypeSuggestions(data, query); - cache[q] = parsedlist; - return processAsync(parsedlist); - } - }); - } else if ((query === '' || query === ' ') && resultType == "ID" && !(scheme.match(/resources\/[works|instances]/) || scheme.match(/authorities/) || scheme.match(/entities/))) { - var u = scheme + '/suggest/?count=100&q='; - u = u.replace(/^(http:)/,""); - $.ajax({ - url: encodeURI(u), - dataType: 'jsonp', - success: function (data) { - var parsedlist = exports.processSuggestions(data, ''); - return processAsync(parsedlist); - } - }); - } else if (query.length > 2 && query.substr(0, 1) == '?' && resultType == "ID") { - u = 'http://id.loc.gov/search/?format=jsonp&start=1&count=50&q=' + q; - u = u.replace(/^(http:)/,""); - $.ajax({ - url: encodeURI(u), - dataType: 'jsonp', - success: function (data) { - var parsedlist = exports.processATOM(data, query); - cache[q] = parsedlist; - return processAsync(parsedlist); - } - }); - } else if (query.length >= 2 && resultType == "ID" && query.match(/^[A-Za-z\s]{0,3}[0-9]{3,}$/)) { - if (query.match(/^[0-9]{3,}$/)) { - u = scheme + '/suggest/lccn/' + query.replace(/\s/g,''); - } else { - u = scheme + '/suggest/token/' + query.replace(/\s/g,''); - } - u = u.replace(/^(http:)/,""); - $.ajax({ - url: encodeURI(u), - dataType: 'json', - success: function (data) { - var parsedlist = exports.processSuggestions(data, query); - cache[q] = parsedlist; - return processAsync(parsedlist); - }, - fail: function (err){ - bfelog.addMsg(new Error(), 'INFO',err); - } - }); - } else if (query.length >= 1 && !query.match(/^[A-Za-z]{0,2}[0-9]{2,}$/)) { - if (resultType == "ID"){ - u = scheme + '/suggest/?count=50&q=' + query; - u = u.replace(/^(http:)/,""); - $.ajax({ - url: encodeURI(u), - dataType: 'jsonp', - success: function (data) { - var parsedlist; - - if (resultType == "QA"){ - parsedlist = exports.processQASuggestions(data, query); - } else if (resultType == "RDA") { - parsedlist = exports.processJSONLDSuggestions(data, query); - } else { - parsedlist = exports.processSuggestions(data, query); - } - - cache[q] = parsedlist; - return processAsync(parsedlist); - } - }); - } else { - u = "/profile-edit/server/whichrt?uri=" + scheme + '?q=' + query; - $.ajax({ - url: encodeURI(u), - dataType: 'json', - success: function (data) { - var parsedlist; - - if (resultType == "QA"){ - parsedlist = exports.processQASuggestions(data, query); - } else if (resultType == "RDA") { - parsedlist = exports.processJSONLDSuggestions(data, query); - } else { - return []; - } - cache[q] = parsedlist; - return processAsync(parsedlist); - } - }); - } - } - }, 300); // 300 ms - }; - }); bfe.define('src/lookups/lcsubjects', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); diff --git a/src/lookups/lcshared.js b/src/lookups/lcshared.js new file mode 100644 index 0000000..db88524 --- /dev/null +++ b/src/lookups/lcshared.js @@ -0,0 +1,563 @@ +bfe.define('src/lookups/lcshared', ['require', 'exports', 'src/bfelogging'], function (require, exports) { + // require('https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.js'); + + /* + subjecturi propertyuri selected.uri + selected.uri bf:label selected.value + */ + var bfelog = require('src/bfelogging'); + + exports.getResource = function (subjecturi, property, selected, process) { + var triples = []; + var triple = {}; + if (selected.id == 'literalLookup'){ + triple.s = subjecturi; + triple.p = property.propertyURI; + triple.o = selected.value; + triple.otype = 'literal'; + triples.push(triple); + } else if (selected.id == 'literal'){ + triple.s = subjecturi; + triple.p = 'http://www.w3.org/2000/01/rdf-schema#label'; + triple.o = selected.value; + triple.otype = 'literal'; + triples.push(triple); + } else { + triple.s = subjecturi; + triple.p = property.propertyURI; + triple.o = selected.uri; + triple.otype = 'uri'; + triples.push(triple); + + triple = {}; + triple.s = selected.uri; + triple.p = 'http://www.w3.org/2000/01/rdf-schema#label'; + triple.o = selected.value; + triple.otype = 'literal'; + //triple.olang = 'en'; + triples.push(triple); + } + + return process(triples, property); + }; + + exports.getResourceLabelLookup = function (subjecturi, propertyuri, selected, process) { + var triples = []; + + var triple = {}; + triple.s = subjecturi; + triple.p = propertyuri; + triple.o = selected.uri; + triple.otype = 'uri'; + triples.push(triple); + // add label + var url = selected.uri.replace(/^(http:)/,""); + $.ajax({ + url: url + '.jsonp', + dataType: 'jsonp', + success: function (data) { + data.forEach(function (resource) { + if (resource['@id'] === selected.uri) { + var label = {}; + label.s = selected.uri; + label.otype = 'literal'; + label.p = 'http://www.w3.org/2000/01/rdf-schema#label'; + label.o = resource['http://www.loc.gov/mads/rdf/v1#authoritativeLabel'][0]['@value']; + triples.push(label); + return process(triples); + } + }); + } + }); + }; + + exports.processJSONLDSuggestions = function (suggestions, query, scheme) { + var typeahead_source = []; + if (suggestions['@graph'] !== undefined) { + for (var s = 0; s < suggestions['@graph'].length; s++) { + if (suggestions['@graph'][s].inScheme !== undefined) { + if (suggestions['@graph'][s]['@type'] === 'Concept' && suggestions['@graph'][s].inScheme === scheme) { + if (suggestions['@graph'][s].prefLabel.en.length !== undefined) { + var l = suggestions['@graph'][s].prefLabel.en; + // break; + // var l = suggestions['@graph'][s]['prefLabel']['@value']; + } + var u = suggestions['@graph'][s]['@id']; + typeahead_source.push({ + uri: u, + value: l + }); + } + } + } + } + if (typeahead_source.length === 0) { + typeahead_source[0] = { + uri: '', + value: '[No suggestions found for ' + query + '.]' + }; + } + exports.addLiteralOption(typeahead_source, query); + return typeahead_source; + }; + + exports.processQASuggestions = function (suggestions, query) { + var typeahead_source = []; + if (suggestions[1] !== undefined) { + for (var s = 0; s < suggestions.length; s++) { + var l = suggestions[s]["label"]; + var u = suggestions[s]["uri"]; + var id = suggestions[s]["id"]; + var d = l + ' (' + id + ')'; + + typeahead_source.push({ + uri: u, + id: id, + value: l, + display: d + }); + } + } + if (typeahead_source.length === 0) { + typeahead_source[0] = { + uri: '', + display: '[No suggestions found for ' + query + '.]' + }; + } + exports.addLiteralOption(typeahead_source, query); + + return typeahead_source; + }; + + exports.processNoteTypeSuggestions = function (suggestions, query) { + var typeahead_source = []; + var substrMatch = new RegExp('^' + query, 'i'); + if (suggestions[0].json !== undefined) { + for (var s = 0; s < suggestions[0].json.length; s++) { + var l = suggestions[0].json[s]; + + if(substrMatch.test(l) || _.isEmpty(query)){ + typeahead_source.push({ + uri: "", + id: 'literalLookup', + value: l, + display: l + }); + } + } + } + if (typeahead_source.length === 0) { + typeahead_source[0] = { + uri: '', + display: '[No suggestions found for ' + query + '.]' + }; + } + exports.addLiteralOption(typeahead_source, query); + + return typeahead_source; + }; + + exports.addLiteralOption = function (data, query){ + data.push({uri: "_:b1", id: "literal", value: query, display: query + "(Literal Value)"}); + } + + exports.extractContextData = function(data){ + var results = { source: [], variant : [], uri: data.uri, title: null, contributor:[], date:null, genreForm: null, nodeMap:{}}; + + // if it is in jsonld format + if (data['@graph']){ + data = data['@graph']; + } + + var nodeMap = {}; + + data.forEach(function(n){ + if (n['http://www.loc.gov/mads/rdf/v1#birthDate']){ + nodeMap.birthDate = n['http://www.loc.gov/mads/rdf/v1#birthDate'].map(function(d){ return d['@id']}) + } + if (n['http://www.loc.gov/mads/rdf/v1#birthPlace']){ + nodeMap.birthPlace = n['http://www.loc.gov/mads/rdf/v1#birthPlace'].map(function(d){ return d['@id']}) + } + + if (n['http://www.loc.gov/mads/rdf/v1#associatedLocale']){ + nodeMap.associatedLocale = n['http://www.loc.gov/mads/rdf/v1#associatedLocale'].map(function(d){ return d['@id']}) + } + if (n['http://www.loc.gov/mads/rdf/v1#fieldOfActivity']){ + nodeMap.fieldOfActivity = n['http://www.loc.gov/mads/rdf/v1#fieldOfActivity'].map(function(d){ return d['@id']}) + } + if (n['http://www.loc.gov/mads/rdf/v1#gender']){ + nodeMap.gender = n['http://www.loc.gov/mads/rdf/v1#gender'].map(function(d){ return d['@id']}) + } + if (n['http://www.loc.gov/mads/rdf/v1#occupation']){ + nodeMap.occupation = n['http://www.loc.gov/mads/rdf/v1#occupation'].map(function(d){ return d['@id']}) + } + if (n['http://www.loc.gov/mads/rdf/v1#associatedLanguage']){ + nodeMap.associatedLanguage = n['http://www.loc.gov/mads/rdf/v1#associatedLanguage'].map(function(d){ return d['@id']}) + } + if (n['http://www.loc.gov/mads/rdf/v1#deathDate']){ + nodeMap.deathDate = n['http://www.loc.gov/mads/rdf/v1#deathDate'].map(function(d){ return d['@id']}) + } + if (n['http://www.loc.gov/mads/rdf/v1#hasBroaderAuthority']){ + nodeMap.hasBroaderAuthority = n['http://www.loc.gov/mads/rdf/v1#hasBroaderAuthority'].map(function(d){ return d['@id']}) + } + if (n['http://www.loc.gov/mads/rdf/v1#hasNarrowerAuthority']){ + nodeMap.hasNarrowerAuthority = n['http://www.loc.gov/mads/rdf/v1#hasNarrowerAuthority'].map(function(d){ return d['@id']}) + } + + }) + // pull out the labels + data.forEach(function(n){ + + // loop through all the possible types of row + Object.keys(nodeMap).forEach(function(k){ + if (!results.nodeMap[k]) { results.nodeMap[k] = [] } + // loop through each uri we have for this type + nodeMap[k].forEach(function(uri){ + if (n['@id'] && n['@id'] == uri){ + + if (n['http://www.loc.gov/mads/rdf/v1#authoritativeLabel']){ + n['http://www.loc.gov/mads/rdf/v1#authoritativeLabel'].forEach(function(val){ + if (val['@value']){ + results.nodeMap[k].push(val['@value']); + } + }) + } + if (n['http://www.w3.org/2000/01/rdf-schema#label']){ + n['http://www.w3.org/2000/01/rdf-schema#label'].forEach(function(val){ + if (val['@value']){ + results.nodeMap[k].push(val['@value']); + } + }) + } + } + }) + }) + }) + + data.forEach(function(n){ + + var citation = ''; + var variant = ''; + + if (n['http://www.loc.gov/mads/rdf/v1#citation-source']) { + citation = citation + n['http://www.loc.gov/mads/rdf/v1#citation-source'].map(function (v) { return v['@value'] + ' '; }) + } + if (n['http://www.loc.gov/mads/rdf/v1#citation-note']) { + citation = citation + n['http://www.loc.gov/mads/rdf/v1#citation-note'].map(function (v) { return v['@value'] + ' '; }) + } + if (n['http://www.loc.gov/mads/rdf/v1#citation-status']) { + citation = citation + n['http://www.loc.gov/mads/rdf/v1#citation-status'].map(function (v) { return v['@value'] + ' '; }) + } + if (n['http://www.loc.gov/mads/rdf/v1#variantLabel']) { + variant = variant + n['http://www.loc.gov/mads/rdf/v1#variantLabel'].map(function (v) { return v['@value'] + ' '; }) + } + citation = citation.trim() + variant = variant.trim() + if (variant != ''){ results.variant.push(variant)} + if (citation != ''){ results.source.push(citation)} + + + if (n['@type'] && n['@type'] == 'http://id.loc.gov/ontologies/bibframe/Title'){ + if (n['bibframe:mainTitle']){ + results.title = n['bibframe:mainTitle'] + } + } + if (n['@type'] && (n['@type'] == 'http://id.loc.gov/ontologies/bibframe/Agent' || n['@type'].indexOf('http://id.loc.gov/ontologies/bibframe/Agent') > -1 )){ + if (n['bflc:name00MatchKey']){ + results.contributor.push(n['bflc:name00MatchKey']); + } + } + if (n['bibframe:creationDate'] && n['bibframe:creationDate']['@value']){ + results.date = n['bibframe:creationDate']['@value']; + } + if (n['@type'] && n['@type'] == 'http://id.loc.gov/ontologies/bibframe/GenreForm'){ + if (n['bibframe:mainTitle']){ + results.genreForm = n['rdf-schema:label']; + } + } + }); + return results; + } + + exports.fetchContextData = function(uri,callback){ + + if (uri.indexOf('id.loc.gov/') > -1 && uri.match(/(authorities|vocabulary)/)) { + var jsonuri = uri + '.madsrdf_raw.jsonld'; + } else { + jsonuri = uri + '.jsonld'; + } + + if (uri.indexOf('id.loc.gov') > -1) { + jsonuri = jsonuri.replace(/^(http:)/,"https:"); + } + + + $.ajax({ + url: jsonuri, + dataType: 'json', + success: function (data) { + + var id = uri.split('/')[uri.split('/').length-1]; + data.uri = uri; + + var d = JSON.stringify(exports.extractContextData(data)); + sessionStorage.setItem(id, d); + if (callback){ + callback(d) + } + } + }); + }; + + exports.rdfType = function(type){ + var rdftype = ''; + if (type == 'http://www.loc.gov/mads/rdf/v1#PersonalName' || type == 'http://id.loc.gov/ontologies/bibframe/Person') { + rdftype = 'rdftype:PersonalName'; + } else if (type == 'http://id.loc.gov/ontologies/bibframe/Topic') { + rdftype = '(rdftype:Topic OR rdftype:ComplexSubject)'; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Place' || type == 'http://id.loc.gov/ontologies/bibframe/Place' || type == 'http://www.loc.gov/mads/rdf/v1#Geographic') { + rdftype = 'rdftype:Geographic'; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Temporal'){ + rdftype= 'rdftype:Temporal'; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Organization' || type == 'http://id.loc.gov/ontologies/bibframe/Organization') { + rdftype = 'rdftype:CorporateName'; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Family' || type == 'http://id.loc.gov/ontologies/bibframe/Family') { + rdftype = "rdftype:FamilyName"; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Meeting' || type == 'http://id.loc.gov/ontologies/bibframe/Meeting') { + rdftype = 'rdftype:ConferenceName'; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Jurisdiction' || type == 'http://id.loc.gov/ontologies/bibframe/Jurisdiction') { + rdftype = 'rdftype:Geographic'; + } else if (type == 'http://id.loc.gov/ontologies/bibframe/GenreForm' || type == 'http://www.loc.gov/mads/rdf/v1#GenreForm') { + rdftype = 'rdftype:GenreForm'; + } else if (type == 'http://id.loc.gov/ontologies/bibframe/Role') { + rdftype = 'rdftype:Role'; + } + return rdftype; + } + + exports.processSuggestions = function (suggestions, query) { + + var typeahead_source = []; + if (suggestions[1] !== undefined) { + for (var s = 0; s < suggestions[1].length; s++) { + var l = suggestions[1][s]; + var u = suggestions[3][s]; + var id = u.replace(/.+\/(.+)/, '$1'); + if (id.length==32){ + var d = l; + }else{ + d = l + ' (' + id + ')'; + } + + if (suggestions.length === 5) { + var i = suggestions[4][s]; + var li = l + ' (' + i + ')'; + } else { + li = l; + } + + typeahead_source.push({ + uri: u, + id: id, + value: li, + display: d + }); + } + } + if (typeahead_source.length === 0) { + typeahead_source[0] = { + uri: '', + display: '[No suggestions found for ' + query + '.]' + }; + } + exports.addLiteralOption(typeahead_source, query); + + return typeahead_source; + }; + + exports.processATOM = function (atomjson, query) { + var typeahead_source = []; + for (var k in atomjson) { + if (atomjson[k][0] == 'atom:entry') { + var t = ''; + var u = ''; + var source = ''; + var d = ''; + for (var e in atomjson[k]) { + if (atomjson[k][e][0] == 'atom:title') { + t = atomjson[k][e][2]; + } + if (atomjson[k][e][0] == 'atom:link') { + u = atomjson[k][e][1].href; + source = u.substr(0, u.lastIndexOf('/')); + var id = u.replace(/.+\/(.+)/, '$1'); + d = t + ' (' + id + ')'; + } + if (t !== '' && u !== '') { + typeahead_source.push({ + uri: u, + source: source, + value: t, + display: d + }); + break; + } + bfelog.addMsg(new Error(), 'INFO', typeahead_source); + } + } + } + if (typeahead_source.length === 0) { + typeahead_source[0] = { + uri: '', + display: '[No suggestions found for ' + query + '.]' + }; + } + // console.log(typeahead_source); + return typeahead_source; + }; + + exports.simpleQuery = function (query, cache, scheme, processSync, processAsync) { + return exports.complexQuery (query, cache, scheme, "ID" , processSync, processAsync, null) + } + + exports.complexQuery = function (query, cache, scheme, resultType, processSync, processAsync, formobject) { + bfelog.addMsg(new Error(), 'INFO','q is ' + query); + + if (!_.isEmpty(formobject)){ + var triples = formobject.store; + + var type = ''; + var hits = _.where(triples, { + 'p': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' + }); + if (hits[0] !== undefined) { + type = hits[0].o; + } + + var rdftype = exports.rdfType(type); + var q = ''; + if (scheme !== '' && rdftype !== '') { + q = 'cs:' + scheme + ' AND ' + rdftype; + } else if (rdftype !== '') { + q = rdftype; + } else if (scheme !== '') { + q = 'cs:' + scheme; + } + + if (q !== '') { + q = q + ' AND ' + query.replace('?', '').normalize() + '*'; + } else { + q = query.normalize(); + } + } else { + q = query.normalize(); + } + + if (cache[q]) { + processSync(cache[q]); + return; + } + if (typeof this.searching !== 'undefined') { + clearTimeout(this.searching); + processSync([]); + } + this.searching = setTimeout(function () { + if (resultType == "NoteType") { + u = config.url + "/profile-edit/server/whichrt?uri=" + scheme; + $.ajax({ + url: encodeURI(u), + dataType: 'json', + success: function (data) { + var parsedlist = exports.processNoteTypeSuggestions(data, query); + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } else if ((query === '' || query === ' ') && resultType == "ID" && !(scheme.match(/resources\/[works|instances]/) || scheme.match(/authorities/) || scheme.match(/entities/))) { + var u = scheme + '/suggest/?count=100&q='; + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'jsonp', + success: function (data) { + var parsedlist = exports.processSuggestions(data, ''); + return processAsync(parsedlist); + } + }); + } else if (query.length > 2 && query.substr(0, 1) == '?' && resultType == "ID") { + u = 'http://id.loc.gov/search/?format=jsonp&start=1&count=50&q=' + q; + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'jsonp', + success: function (data) { + var parsedlist = exports.processATOM(data, query); + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } else if (query.length >= 2 && resultType == "ID" && query.match(/^[A-Za-z\s]{0,3}[0-9]{3,}$/)) { + if (query.match(/^[0-9]{3,}$/)) { + u = scheme + '/suggest/lccn/' + query.replace(/\s/g,''); + } else { + u = scheme + '/suggest/token/' + query.replace(/\s/g,''); + } + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'json', + success: function (data) { + var parsedlist = exports.processSuggestions(data, query); + cache[q] = parsedlist; + return processAsync(parsedlist); + }, + fail: function (err){ + bfelog.addMsg(new Error(), 'INFO',err); + } + }); + } else if (query.length >= 1 && !query.match(/^[A-Za-z]{0,2}[0-9]{2,}$/)) { + if (resultType == "ID"){ + u = scheme + '/suggest/?count=50&q=' + query; + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'jsonp', + success: function (data) { + var parsedlist; + + if (resultType == "QA"){ + parsedlist = exports.processQASuggestions(data, query); + } else if (resultType == "RDA") { + parsedlist = exports.processJSONLDSuggestions(data, query); + } else { + parsedlist = exports.processSuggestions(data, query); + } + + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } else { + u = "/profile-edit/server/whichrt?uri=" + scheme + '?q=' + query; + $.ajax({ + url: encodeURI(u), + dataType: 'json', + success: function (data) { + var parsedlist; + + if (resultType == "QA"){ + parsedlist = exports.processQASuggestions(data, query); + } else if (resultType == "RDA") { + parsedlist = exports.processJSONLDSuggestions(data, query); + } else { + return []; + } + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } + } + }, 300); // 300 ms + }; + }); \ No newline at end of file diff --git a/test.html b/test.html index 32c461a..926ddfa 100755 --- a/test.html +++ b/test.html @@ -65,8 +65,11 @@ + + + From 239b28cfa63ab3894b1678d95e33229322760c1a Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Thu, 1 Apr 2021 17:05:13 -0400 Subject: [PATCH 13/32] WIP. Massive refactor to break up lookup code, integrate suggest2 service. --- development.html | 4 + editor-dev.html | 4 +- fulleditor-dev.html | 2 + src/bfe.js | 101 ++++++---- src/bfelookups.js | 72 ++++--- src/lookups/lcshared.js | 323 +++---------------------------- src/lookups/lcshared_suggest1.js | 279 ++++++++++++++++++++++++++ src/lookups/lcshared_suggest2.js | 167 ++++++++++++++++ src/lookups/names-preprod.js | 7 +- test.html | 2 + 10 files changed, 590 insertions(+), 371 deletions(-) create mode 100644 src/lookups/lcshared_suggest1.js create mode 100644 src/lookups/lcshared_suggest2.js diff --git a/development.html b/development.html index 8d30ced..51845f3 100755 --- a/development.html +++ b/development.html @@ -65,9 +65,13 @@ + + + + diff --git a/editor-dev.html b/editor-dev.html index 3856211..5870f4d 100644 --- a/editor-dev.html +++ b/editor-dev.html @@ -54,10 +54,12 @@ + + - + diff --git a/fulleditor-dev.html b/fulleditor-dev.html index 6533403..d035d4c 100644 --- a/fulleditor-dev.html +++ b/fulleditor-dev.html @@ -54,6 +54,8 @@ + + diff --git a/src/bfe.js b/src/bfe.js index 4057e76..64045f0 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -4396,30 +4396,38 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' var uvfs = p.valueConstraint.useValuesFrom; var dshashes = []; uvfs.forEach(function (uvf) { - // var lups = _.where(lookups, {"scheme": uvf}); - var lu = lookups[uvf]; - if (lu === undefined) { - lu = buildLookup(uvf); - lookups[uvf] = lu; - } + // var lups = _.where(lookups, {"scheme": uvf}); + var lu = lookups[uvf]; + if (lu === undefined) { + bfelog.addMsg(new Error(), 'DEBUG', 'Lookup undefined for ' + uvf + '. Will try to build one.'); + /* + The lookup is undefined because it has not been supplied + either in the config or in the block of lookup definitions + above. Therefore, let's try to build one based on what we can + learn from the use values from URI and the relevant + systems. + */ + lu = buildLookup(uvf); + lookups[uvf] = lu; + } + + bfelog.addMsg(new Error(), 'DEBUG', 'Setting typeahead scheme: ' + uvf); + bfelog.addMsg(new Error(), 'DEBUG', 'Lookup is', lu); - bfelog.addMsg(new Error(), 'DEBUG', 'Setting typeahead scheme: ' + uvf); - bfelog.addMsg(new Error(), 'DEBUG', 'Lookup is', lu); - - var dshash = {}; - dshash.scheme = uvf; - dshash.name = lu.name; - dshash.source = function (query, sync, async) { - lu.load.source(query, sync, async, formobject); - }; - dshash.limit = 50; - dshash.templates = { - header: '

' + lu.name + '

', - footer: '' - }; - // dshash.displayKey = (dshash.name.match(/^LCNAF|^LCSH/)) ? 'display' : 'value'; - dshash.displayKey = 'display'; - dshashes.push(dshash); + var dshash = {}; + dshash.scheme = uvf; + dshash.name = lu.name; + dshash.source = function (query, sync, async) { + lu.load.source(query, sync, async, formobject); + }; + dshash.limit = 50; + dshash.templates = { + header: '

' + lu.name + '

', + footer: '' + }; + // dshash.displayKey = (dshash.name.match(/^LCNAF|^LCSH/)) ? 'display' : 'value'; + dshash.displayKey = 'display'; + dshashes.push(dshash); }); bfelog.addMsg(new Error(), 'DEBUG', 'Data source hashes', dshashes); @@ -4913,23 +4921,38 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' }); } - function buildLookup(name) { - var lcshared = require('src/lookups/lcshared'); - var cache = []; - var lu = {}; - lu.name = name.substr(name.lastIndexOf('/') + 1); - lu.load = {}; - lu.load.scheme = name; - lu.load.source = function (query, processSync, processAsync) { - return lcshared.simpleQuery(query, cache, name, processSync, processAsync); - }; - - lu.load.getResource = function (subjecturi, property, selected, process) { - return lcshared.getResource(subjecturi, property, selected, process); - }; + /* + Let's see if we can build a lookup based on the scheme. + */ + function buildLookup(scheme) { + var lcshared = require('src/lookups/lcshared'); + var cache = []; + var lu = {}; + lu.name = scheme.substr(scheme.lastIndexOf('/') + 1); + lu.load = {}; + lu.load.scheme = scheme; + if ( scheme.indexOf('id.loc.gov') > 0 ) { + var suggest2 = require('src/lookups/lcshared_suggest2'); + lu.load.source = function (query, processSync, processAsync) { + return suggest2.suggest2Query(query, cache, scheme, processSync, processAsync); + }; + lu.load.getResource = function (subjecturi, property, selected, process) { + return lcshared.getResource(subjecturi, property, selected, process); + }; + } else { + // Well, the 'else' kicks it back to what existed before and that's + // OK for now. + var suggest1 = require('src/lookups/lcshared_suggest1'); + lu.load.source = function (query, processSync, processAsync) { + return suggest1.suggest1Query(query, cache, scheme, "ID", processSync, processAsync); + }; - return lu; - } + lu.load.getResource = function (subjecturi, property, selected, process) { + return lcshared.getResource(subjecturi, property, selected, process); + }; + } + return lu; + } function editTriple(formobjectID, inputID, t) { var formobject = _.where(forms, { diff --git a/src/bfelookups.js b/src/bfelookups.js index 96294f3..8427eba 100644 --- a/src/bfelookups.js +++ b/src/bfelookups.js @@ -1,5 +1,6 @@ -bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { +bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', 'src/lookups/lcshared_suggest2', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest2 = require('src/lookups/lcshared_suggest2'); var bfelog = require('src/bfelogging'); var cache = {}; @@ -56,14 +57,13 @@ bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', bfelog.addMsg(new Error(), 'INFO',query); if (rdftype !== '') { suggestquery += '&rdftype=' + rdftype.replace('rdftype:', ''); } - var u = exports.scheme + '/suggest/?q=' + suggestquery + '&count=50'; + var u = exports.scheme + '/suggest2/?q=' + suggestquery + '&count=50'; u = u.replace(/^(http:)/,""); - console.log("calling lookup") $.ajax({ url: u, dataType: 'jsonp', success: function (data) { - var parsedlist = lcshared.processSuggestions(data, query); + var parsedlist = suggest2.processSuggestions(data, query); cache[q] = parsedlist; return processAsync(parsedlist); } @@ -98,8 +98,9 @@ bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', }); - bfe.define('src/lookups/lcsubjects', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/lcsubjects', ['require', 'exports', 'src/lookups/lcshared', 'src/lookups/lcshared_suggest2', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest2 = require('src/lookups/lcshared_suggest2'); var bfelog = require('src/bfelogging'); var cache = []; @@ -155,13 +156,13 @@ bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', var suggestquery = query.normalize(); if (rdftype !== '') { suggestquery += '&rdftype=' + rdftype.replace('rdftype:', ''); } - var u = exports.scheme + '/suggest/?count=20&q=' + suggestquery; + var u = exports.scheme + '/suggest2/?count=20&q=' + suggestquery; u = u.replace(/^(http:)/,""); $.ajax({ url: encodeURI(u), dataType: 'jsonp', success: function (data) { - var parsedlist = lcshared.processSuggestions(data, query); + var parsedlist = suggest2.processSuggestions(data, query); cache[q] = parsedlist; return processAsync(parsedlist); } @@ -170,7 +171,7 @@ bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', if (query.match(/^[Ss][A-z\s]{0,2}\d/)){ q = query.replace(/\s+/g,'').normalize(); } - u = 'http://id.loc.gov/search/?format=jsonp&start=1&count=50&q=' + q; + u = 'https://id.loc.gov/search/?format=jsonp&start=1&count=50&q=' + q; u = u.replace(/^(http:)/,""); $.ajax({ url: encodeURI(u), @@ -197,8 +198,9 @@ bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', */ exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/lcgenreforms', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/lcgenreforms', ['require', 'exports', 'src/lookups/lcshared_suggest2', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest2 = require('src/lookups/lcshared_suggest2'); var bfelog = require('src/bfelogging'); var cache = []; @@ -206,141 +208,151 @@ bfe.define('src/lookups/lcnames', ['require', 'exports', 'src/lookups/lcshared', exports.source = function (query, processSync, processAsync, formobject) { bfelog.addMsg(new Error(), 'INFO', query); - return lcshared.complexQuery(query, cache, exports.scheme, "ID", processSync, processAsync, formobject); + return suggest2.suggest2Query(query, cache, exports.scheme, processSync, processAsync, formobject); }; exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/rdaformatnotemus', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/rdaformatnotemus', ['require', 'exports', 'src/lookups/lcshared_suggest1', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest1 = require('src/lookups/lcshared_suggest1'); var bfelog = require('src/bfelogging'); var cache = []; exports.scheme = 'http://rdaregistry.info/termList/FormatNoteMus'; exports.source = function (query, processSync, processAsync) { bfelog.addMsg(new Error(), 'INFO', query); - return lcshared.complexQuery(query, cache, exports.scheme, "RDA", processSync, processAsync, null); + return suggest1.suggest1Query(query, cache, exports.scheme, "RDA", processSync, processAsync, null); }; exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/rdamediatype', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/rdamediatype', ['require', 'exports', 'src/lookups/lcshared_suggest1', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest1 = require('src/lookups/lcshared_suggest1'); var bfelog = require('src/bfelogging'); var cache = []; exports.scheme = 'http://rdaregistry.info/termList/RDAMediaType'; exports.source = function (query, processSync, processAsync) { bfelog.addMsg(new Error(), 'INFO', query); - return lcshared.complexQuery(query, cache, exports.scheme, "RDA", processSync, processAsync, null); + return suggest1.suggest1Query(query, cache, exports.scheme, "RDA", processSync, processAsync, null); }; exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/rdamodeissue', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/rdamodeissue', ['require', 'exports', 'src/lookups/lcshared_suggest1', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest1 = require('src/lookups/lcshared_suggest1'); var bfelog = require('src/bfelogging'); var cache = []; exports.scheme = 'http://rdaregistry.info/termList/ModeIssue'; exports.source = function (query, processSync, processAsync) { bfelog.addMsg(new Error(), 'INFO', query); - return lcshared.complexQuery(query, cache, exports.scheme, "RDA", processSync, processAsync, null); + return suggest1.suggest1Query(query, cache, exports.scheme, "RDA", processSync, processAsync, null); }; exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/rdacarriertype', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/rdacarriertype', ['require', 'exports', 'src/lookups/lcshared_suggest1', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest1 = require('src/lookups/lcshared_suggest1'); var bfelog = require('src/bfelogging'); var cache = []; exports.scheme = 'http://rdaregistry.info/termList/RDACarrierType'; exports.source = function (query, processSync, processAsync) { bfelog.addMsg(new Error(), 'INFO', query); - return lcshared.complexQuery(query, cache, exports.scheme, "RDA", processSync, processAsync, null); + return suggest1.suggest1Query(query, cache, exports.scheme, "RDA", processSync, processAsync, null); }; exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/rdacontenttype', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/rdacontenttype', ['require', 'exports', 'src/lookups/lcshared_suggest1', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest1 = require('src/lookups/lcshared_suggest1'); var bfelog = require('src/bfelogging'); var cache = []; exports.scheme = 'http://rdaregistry.info/termList/RDAContentType'; exports.source = function (query, processSync, processAsync) { bfelog.addMsg(new Error(), 'INFO', query); - return lcshared.complexQuery(query, cache, exports.scheme, "RDA", processSync, processAsync, null); + return suggest1.suggest1Query(query, cache, exports.scheme, "RDA", processSync, processAsync, null); }; exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/rdafrequency', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/rdafrequency', ['require', 'exports', 'src/lookups/lcshared_suggest1', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest1 = require('src/lookups/lcshared_suggest1'); var bfelog = require('src/bfelogging'); var cache = []; exports.scheme = 'http://rdaregistry.info/termList/frequency'; exports.source = function (query, processSync, processAsync) { bfelog.addMsg(new Error(), 'INFO', query); - return lcshared.complexQuery(query, cache, exports.scheme, "RDA", processSync, processAsync); + return suggest1.suggest1Query(query, cache, exports.scheme, "RDA", processSync, processAsync); }; exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/rdaaspectration', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/rdaaspectration', ['require', 'exports', 'src/lookups/lcshared_suggest1', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest1 = require('src/lookups/lcshared_suggest1'); var bfelog = require('src/bfelogging'); var cache = []; exports.scheme = 'http://rdaregistry.info/termList/AspectRatio'; exports.source = function (query, processSync, processAsync) { bfelog.addMsg(new Error(), 'INFO', query); - return lcshared.complexQuery(query, cache, exports.scheme, "RDA", processSync, processAsync, null); + return suggest1.suggest1Query(query, cache, exports.scheme, "RDA", processSync, processAsync, null); }; exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/rdageneration', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/rdageneration', ['require', 'exports', 'src/lookups/lcshared_suggest1', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest1 = require('src/lookups/lcshared_suggest1'); var bfelog = require('src/bfelogging'); var cache = []; exports.scheme = 'http://rdaregistry.info/termList/RDAGeneration'; exports.source = function (query, processSync, processAsync) { bfelog.addMsg(new Error(), 'INFO', query); - return lcshared.complexQuery(query, cache, exports.scheme, "RDA", processSync, processAsync, null); + return suggest1.suggest1Query(query, cache, exports.scheme, "RDA", processSync, processAsync, null); }; exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/qagetty', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/qagetty', ['require', 'exports', 'src/lookups/lcshared_suggest1', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest1 = require('src/lookups/lcshared_suggest1'); var bfelog = require('src/bfelogging'); var cache = []; exports.scheme = 'https://lookup.ld4l.org/authorities/search/linked_data/getty_aat_ld4l_cache'; exports.source = function (query, processSync, processAsync, formobject) { bfelog.addMsg(new Error(), 'INFO', query); - return lcshared.complexQuery(query, cache, exports.scheme, "QA", processSync, processAsync, formobject); + return suggest1.suggest1Query(query, cache, exports.scheme, "QA", processSync, processAsync, formobject); }; exports.getResource = lcshared.getResource; }); - bfe.define('src/lookups/notetype', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + bfe.define('src/lookups/notetype', ['require', 'exports', 'src/lookups/lcshared_suggest1', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest1 = require('src/lookups/lcshared_suggest1'); var bfelog = require('src/bfelogging'); var cache = []; exports.scheme = '/api/listconfigs/?where=index.resourceType:noteTypes'; exports.source = function (query, processSync, processAsync, formobject) { bfelog.addMsg(new Error(), 'INFO', query); - return lcshared.complexQuery(query, cache, exports.scheme, "NoteType", processSync, processAsync, formobject); + return suggest1.suggest1Query(query, cache, exports.scheme, "NoteType", processSync, processAsync, formobject); }; exports.getResource = lcshared.getResource; diff --git a/src/lookups/lcshared.js b/src/lookups/lcshared.js index db88524..af810a1 100644 --- a/src/lookups/lcshared.js +++ b/src/lookups/lcshared.js @@ -70,96 +70,7 @@ bfe.define('src/lookups/lcshared', ['require', 'exports', 'src/bfelogging'], fun } }); }; - - exports.processJSONLDSuggestions = function (suggestions, query, scheme) { - var typeahead_source = []; - if (suggestions['@graph'] !== undefined) { - for (var s = 0; s < suggestions['@graph'].length; s++) { - if (suggestions['@graph'][s].inScheme !== undefined) { - if (suggestions['@graph'][s]['@type'] === 'Concept' && suggestions['@graph'][s].inScheme === scheme) { - if (suggestions['@graph'][s].prefLabel.en.length !== undefined) { - var l = suggestions['@graph'][s].prefLabel.en; - // break; - // var l = suggestions['@graph'][s]['prefLabel']['@value']; - } - var u = suggestions['@graph'][s]['@id']; - typeahead_source.push({ - uri: u, - value: l - }); - } - } - } - } - if (typeahead_source.length === 0) { - typeahead_source[0] = { - uri: '', - value: '[No suggestions found for ' + query + '.]' - }; - } - exports.addLiteralOption(typeahead_source, query); - return typeahead_source; - }; - - exports.processQASuggestions = function (suggestions, query) { - var typeahead_source = []; - if (suggestions[1] !== undefined) { - for (var s = 0; s < suggestions.length; s++) { - var l = suggestions[s]["label"]; - var u = suggestions[s]["uri"]; - var id = suggestions[s]["id"]; - var d = l + ' (' + id + ')'; - - typeahead_source.push({ - uri: u, - id: id, - value: l, - display: d - }); - } - } - if (typeahead_source.length === 0) { - typeahead_source[0] = { - uri: '', - display: '[No suggestions found for ' + query + '.]' - }; - } - exports.addLiteralOption(typeahead_source, query); - - return typeahead_source; - }; - - exports.processNoteTypeSuggestions = function (suggestions, query) { - var typeahead_source = []; - var substrMatch = new RegExp('^' + query, 'i'); - if (suggestions[0].json !== undefined) { - for (var s = 0; s < suggestions[0].json.length; s++) { - var l = suggestions[0].json[s]; - - if(substrMatch.test(l) || _.isEmpty(query)){ - typeahead_source.push({ - uri: "", - id: 'literalLookup', - value: l, - display: l - }); - } - } - } - if (typeahead_source.length === 0) { - typeahead_source[0] = { - uri: '', - display: '[No suggestions found for ' + query + '.]' - }; - } - exports.addLiteralOption(typeahead_source, query); - return typeahead_source; - }; - - exports.addLiteralOption = function (data, query){ - data.push({uri: "_:b1", id: "literal", value: query, display: query + "(Literal Value)"}); - } exports.extractContextData = function(data){ var results = { source: [], variant : [], uri: data.uri, title: null, contributor:[], date:null, genreForm: null, nodeMap:{}}; @@ -309,72 +220,6 @@ bfe.define('src/lookups/lcshared', ['require', 'exports', 'src/bfelogging'], fun }); }; - exports.rdfType = function(type){ - var rdftype = ''; - if (type == 'http://www.loc.gov/mads/rdf/v1#PersonalName' || type == 'http://id.loc.gov/ontologies/bibframe/Person') { - rdftype = 'rdftype:PersonalName'; - } else if (type == 'http://id.loc.gov/ontologies/bibframe/Topic') { - rdftype = '(rdftype:Topic OR rdftype:ComplexSubject)'; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Place' || type == 'http://id.loc.gov/ontologies/bibframe/Place' || type == 'http://www.loc.gov/mads/rdf/v1#Geographic') { - rdftype = 'rdftype:Geographic'; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Temporal'){ - rdftype= 'rdftype:Temporal'; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Organization' || type == 'http://id.loc.gov/ontologies/bibframe/Organization') { - rdftype = 'rdftype:CorporateName'; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Family' || type == 'http://id.loc.gov/ontologies/bibframe/Family') { - rdftype = "rdftype:FamilyName"; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Meeting' || type == 'http://id.loc.gov/ontologies/bibframe/Meeting') { - rdftype = 'rdftype:ConferenceName'; - } else if (type == 'http://www.loc.gov/mads/rdf/v1#Jurisdiction' || type == 'http://id.loc.gov/ontologies/bibframe/Jurisdiction') { - rdftype = 'rdftype:Geographic'; - } else if (type == 'http://id.loc.gov/ontologies/bibframe/GenreForm' || type == 'http://www.loc.gov/mads/rdf/v1#GenreForm') { - rdftype = 'rdftype:GenreForm'; - } else if (type == 'http://id.loc.gov/ontologies/bibframe/Role') { - rdftype = 'rdftype:Role'; - } - return rdftype; - } - - exports.processSuggestions = function (suggestions, query) { - - var typeahead_source = []; - if (suggestions[1] !== undefined) { - for (var s = 0; s < suggestions[1].length; s++) { - var l = suggestions[1][s]; - var u = suggestions[3][s]; - var id = u.replace(/.+\/(.+)/, '$1'); - if (id.length==32){ - var d = l; - }else{ - d = l + ' (' + id + ')'; - } - - if (suggestions.length === 5) { - var i = suggestions[4][s]; - var li = l + ' (' + i + ')'; - } else { - li = l; - } - - typeahead_source.push({ - uri: u, - id: id, - value: li, - display: d - }); - } - } - if (typeahead_source.length === 0) { - typeahead_source[0] = { - uri: '', - display: '[No suggestions found for ' + query + '.]' - }; - } - exports.addLiteralOption(typeahead_source, query); - - return typeahead_source; - }; - exports.processATOM = function (atomjson, query) { var typeahead_source = []; for (var k in atomjson) { @@ -415,149 +260,31 @@ bfe.define('src/lookups/lcshared', ['require', 'exports', 'src/bfelogging'], fun // console.log(typeahead_source); return typeahead_source; }; - - exports.simpleQuery = function (query, cache, scheme, processSync, processAsync) { - return exports.complexQuery (query, cache, scheme, "ID" , processSync, processAsync, null) - } - - exports.complexQuery = function (query, cache, scheme, resultType, processSync, processAsync, formobject) { - bfelog.addMsg(new Error(), 'INFO','q is ' + query); - - if (!_.isEmpty(formobject)){ - var triples = formobject.store; - var type = ''; - var hits = _.where(triples, { - 'p': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' - }); - if (hits[0] !== undefined) { - type = hits[0].o; - } - - var rdftype = exports.rdfType(type); - var q = ''; - if (scheme !== '' && rdftype !== '') { - q = 'cs:' + scheme + ' AND ' + rdftype; - } else if (rdftype !== '') { - q = rdftype; - } else if (scheme !== '') { - q = 'cs:' + scheme; - } - - if (q !== '') { - q = q + ' AND ' + query.replace('?', '').normalize() + '*'; - } else { - q = query.normalize(); - } - } else { - q = query.normalize(); - } - - if (cache[q]) { - processSync(cache[q]); - return; - } - if (typeof this.searching !== 'undefined') { - clearTimeout(this.searching); - processSync([]); + exports.rdfType = function(type){ + var rdftype = ''; + if (type == 'http://www.loc.gov/mads/rdf/v1#PersonalName' || type == 'http://id.loc.gov/ontologies/bibframe/Person') { + rdftype = 'rdftype:PersonalName'; + } else if (type == 'http://id.loc.gov/ontologies/bibframe/Topic') { + rdftype = '(rdftype:Topic OR rdftype:ComplexSubject)'; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Place' || type == 'http://id.loc.gov/ontologies/bibframe/Place' || type == 'http://www.loc.gov/mads/rdf/v1#Geographic') { + rdftype = 'rdftype:Geographic'; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Temporal'){ + rdftype= 'rdftype:Temporal'; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Organization' || type == 'http://id.loc.gov/ontologies/bibframe/Organization') { + rdftype = 'rdftype:CorporateName'; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Family' || type == 'http://id.loc.gov/ontologies/bibframe/Family') { + rdftype = "rdftype:FamilyName"; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Meeting' || type == 'http://id.loc.gov/ontologies/bibframe/Meeting') { + rdftype = 'rdftype:ConferenceName'; + } else if (type == 'http://www.loc.gov/mads/rdf/v1#Jurisdiction' || type == 'http://id.loc.gov/ontologies/bibframe/Jurisdiction') { + rdftype = 'rdftype:Geographic'; + } else if (type == 'http://id.loc.gov/ontologies/bibframe/GenreForm' || type == 'http://www.loc.gov/mads/rdf/v1#GenreForm') { + rdftype = 'rdftype:GenreForm'; + } else if (type == 'http://id.loc.gov/ontologies/bibframe/Role') { + rdftype = 'rdftype:Role'; } - this.searching = setTimeout(function () { - if (resultType == "NoteType") { - u = config.url + "/profile-edit/server/whichrt?uri=" + scheme; - $.ajax({ - url: encodeURI(u), - dataType: 'json', - success: function (data) { - var parsedlist = exports.processNoteTypeSuggestions(data, query); - cache[q] = parsedlist; - return processAsync(parsedlist); - } - }); - } else if ((query === '' || query === ' ') && resultType == "ID" && !(scheme.match(/resources\/[works|instances]/) || scheme.match(/authorities/) || scheme.match(/entities/))) { - var u = scheme + '/suggest/?count=100&q='; - u = u.replace(/^(http:)/,""); - $.ajax({ - url: encodeURI(u), - dataType: 'jsonp', - success: function (data) { - var parsedlist = exports.processSuggestions(data, ''); - return processAsync(parsedlist); - } - }); - } else if (query.length > 2 && query.substr(0, 1) == '?' && resultType == "ID") { - u = 'http://id.loc.gov/search/?format=jsonp&start=1&count=50&q=' + q; - u = u.replace(/^(http:)/,""); - $.ajax({ - url: encodeURI(u), - dataType: 'jsonp', - success: function (data) { - var parsedlist = exports.processATOM(data, query); - cache[q] = parsedlist; - return processAsync(parsedlist); - } - }); - } else if (query.length >= 2 && resultType == "ID" && query.match(/^[A-Za-z\s]{0,3}[0-9]{3,}$/)) { - if (query.match(/^[0-9]{3,}$/)) { - u = scheme + '/suggest/lccn/' + query.replace(/\s/g,''); - } else { - u = scheme + '/suggest/token/' + query.replace(/\s/g,''); - } - u = u.replace(/^(http:)/,""); - $.ajax({ - url: encodeURI(u), - dataType: 'json', - success: function (data) { - var parsedlist = exports.processSuggestions(data, query); - cache[q] = parsedlist; - return processAsync(parsedlist); - }, - fail: function (err){ - bfelog.addMsg(new Error(), 'INFO',err); - } - }); - } else if (query.length >= 1 && !query.match(/^[A-Za-z]{0,2}[0-9]{2,}$/)) { - if (resultType == "ID"){ - u = scheme + '/suggest/?count=50&q=' + query; - u = u.replace(/^(http:)/,""); - $.ajax({ - url: encodeURI(u), - dataType: 'jsonp', - success: function (data) { - var parsedlist; - - if (resultType == "QA"){ - parsedlist = exports.processQASuggestions(data, query); - } else if (resultType == "RDA") { - parsedlist = exports.processJSONLDSuggestions(data, query); - } else { - parsedlist = exports.processSuggestions(data, query); - } - - cache[q] = parsedlist; - return processAsync(parsedlist); - } - }); - } else { - u = "/profile-edit/server/whichrt?uri=" + scheme + '?q=' + query; - $.ajax({ - url: encodeURI(u), - dataType: 'json', - success: function (data) { - var parsedlist; + return rdftype; + } - if (resultType == "QA"){ - parsedlist = exports.processQASuggestions(data, query); - } else if (resultType == "RDA") { - parsedlist = exports.processJSONLDSuggestions(data, query); - } else { - return []; - } - cache[q] = parsedlist; - return processAsync(parsedlist); - } - }); - } - } - }, 300); // 300 ms - }; - }); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/lookups/lcshared_suggest1.js b/src/lookups/lcshared_suggest1.js new file mode 100644 index 0000000..9353b68 --- /dev/null +++ b/src/lookups/lcshared_suggest1.js @@ -0,0 +1,279 @@ +bfe.define('src/lookups/lcshared_suggest1', ['require', 'exports', 'src/bfelogging'], function (require, exports) { + // require('https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.js'); + + /* + subjecturi propertyuri selected.uri + selected.uri bf:label selected.value + */ + var bfelog = require('src/bfelogging'); + + var addLiteralOption = function (data, query){ + data.push({uri: "_:b1", id: "literal", value: query, display: query + "(Literal Value)"}); + }; + + processJSONLDSuggestions = function (suggestions, query, scheme) { + var typeahead_source = []; + if (suggestions['@graph'] !== undefined) { + for (var s = 0; s < suggestions['@graph'].length; s++) { + if (suggestions['@graph'][s].inScheme !== undefined) { + if (suggestions['@graph'][s]['@type'] === 'Concept' && suggestions['@graph'][s].inScheme === scheme) { + if (suggestions['@graph'][s].prefLabel.en.length !== undefined) { + var l = suggestions['@graph'][s].prefLabel.en; + // break; + // var l = suggestions['@graph'][s]['prefLabel']['@value']; + } + var u = suggestions['@graph'][s]['@id']; + typeahead_source.push({ + uri: u, + value: l + }); + } + } + } + } + if (typeahead_source.length === 0) { + typeahead_source[0] = { + uri: '', + value: '[No suggestions found for ' + query + '.]' + }; + } + addLiteralOption(typeahead_source, query); + return typeahead_source; + }; + + processQASuggestions = function (suggestions, query) { + var typeahead_source = []; + if (suggestions[1] !== undefined) { + for (var s = 0; s < suggestions.length; s++) { + var l = suggestions[s]["label"]; + var u = suggestions[s]["uri"]; + var id = suggestions[s]["id"]; + var d = l + ' (' + id + ')'; + + typeahead_source.push({ + uri: u, + id: id, + value: l, + display: d + }); + } + } + if (typeahead_source.length === 0) { + typeahead_source[0] = { + uri: '', + display: '[No suggestions found for ' + query + '.]' + }; + } + addLiteralOption(typeahead_source, query); + + return typeahead_source; + }; + + processNoteTypeSuggestions = function (suggestions, query) { + var typeahead_source = []; + var substrMatch = new RegExp('^' + query, 'i'); + if (suggestions[0].json !== undefined) { + for (var s = 0; s < suggestions[0].json.length; s++) { + var l = suggestions[0].json[s]; + + if(substrMatch.test(l) || _.isEmpty(query)){ + typeahead_source.push({ + uri: "", + id: 'literalLookup', + value: l, + display: l + }); + } + } + } + if (typeahead_source.length === 0) { + typeahead_source[0] = { + uri: '', + display: '[No suggestions found for ' + query + '.]' + }; + } + addLiteralOption(typeahead_source, query); + + return typeahead_source; + }; + + processSuggestions = function (suggestions, query) { + var typeahead_source = []; + if (suggestions[1] !== undefined) { + for (var s = 0; s < suggestions[1].length; s++) { + var l = suggestions[1][s]; + var u = suggestions[3][s]; + var id = u.replace(/.+\/(.+)/, '$1'); + if (id.length==32){ + var d = l; + }else{ + d = l + ' (' + id + ')'; + } + + if (suggestions.length === 5) { + var i = suggestions[4][s]; + var li = l + ' (' + i + ')'; + } else { + li = l; + } + + typeahead_source.push({ + uri: u, + id: id, + value: li, + display: d + }); + } + } + if (typeahead_source.length === 0) { + typeahead_source[0] = { + uri: '', + display: '[No suggestions found for ' + query + '.]' + }; + } + addLiteralOption(typeahead_source, query); + + return typeahead_source; + }; + + exports.suggest1Query = function (query, cache, scheme, resultType, processSync, processAsync, formobject) { + bfelog.addMsg(new Error(), 'INFO','q is ' + query); + + if (!_.isEmpty(formobject)){ + var triples = formobject.store; + + var type = ''; + var hits = _.where(triples, { + 'p': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' + }); + if (hits[0] !== undefined) { + type = hits[0].o; + } + + var rdftype = exports.rdfType(type); + var q = ''; + if (scheme !== '' && rdftype !== '') { + q = 'cs:' + scheme + ' AND ' + rdftype; + } else if (rdftype !== '') { + q = rdftype; + } else if (scheme !== '') { + q = 'cs:' + scheme; + } + + if (q !== '') { + q = q + ' AND ' + query.replace('?', '').normalize() + '*'; + } else { + q = query.normalize(); + } + } else { + q = query.normalize(); + } + + if (cache[q]) { + processSync(cache[q]); + return; + } + if (typeof this.searching !== 'undefined') { + clearTimeout(this.searching); + processSync([]); + } + this.searching = setTimeout(function () { + if (resultType == "NoteType") { + u = config.url + "/profile-edit/server/whichrt?uri=" + scheme; + $.ajax({ + url: encodeURI(u), + dataType: 'json', + success: function (data) { + var parsedlist = processNoteTypeSuggestions(data, query); + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } else if ((query === '' || query === ' ') && resultType == "ID" && !(scheme.match(/resources\/[works|instances]/) || scheme.match(/authorities/) || scheme.match(/entities/))) { + var u = scheme + '/suggest/?count=100&q='; + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'jsonp', + success: function (data) { + var parsedlist = processSuggestions(data, ''); + return processAsync(parsedlist); + } + }); + } else if (query.length > 2 && query.substr(0, 1) == '?' && resultType == "ID") { + u = 'http://id.loc.gov/search/?format=jsonp&start=1&count=50&q=' + q; + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'jsonp', + success: function (data) { + var parsedlist = exports.processATOM(data, query); + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } else if (query.length >= 2 && resultType == "ID" && query.match(/^[A-Za-z\s]{0,3}[0-9]{3,}$/)) { + if (query.match(/^[0-9]{3,}$/)) { + u = scheme + '/suggest/lccn/' + query.replace(/\s/g,''); + } else { + u = scheme + '/suggest/token/' + query.replace(/\s/g,''); + } + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'json', + success: function (data) { + var parsedlist = processSuggestions(data, query); + cache[q] = parsedlist; + return processAsync(parsedlist); + }, + fail: function (err){ + bfelog.addMsg(new Error(), 'INFO',err); + } + }); + } else if (query.length >= 1 && !query.match(/^[A-Za-z]{0,2}[0-9]{2,}$/)) { + if (resultType == "ID"){ + u = scheme + '/suggest/?count=50&q=' + query; + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'jsonp', + success: function (data) { + var parsedlist; + + if (resultType == "QA"){ + parsedlist = processQASuggestions(data, query); + } else if (resultType == "RDA") { + parsedlist = processJSONLDSuggestions(data, query); + } else { + parsedlist = processSuggestions(data, query); + } + + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } else { + u = "/profile-edit/server/whichrt?uri=" + scheme + '?q=' + query; + $.ajax({ + url: encodeURI(u), + dataType: 'json', + success: function (data) { + var parsedlist; + + if (resultType == "QA"){ + parsedlist = processQASuggestions(data, query); + } else if (resultType == "RDA") { + parsedlist = processJSONLDSuggestions(data, query); + } else { + return []; + } + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } + } + }, 300); // 300 ms + }; + }); \ No newline at end of file diff --git a/src/lookups/lcshared_suggest2.js b/src/lookups/lcshared_suggest2.js new file mode 100644 index 0000000..a17f5c1 --- /dev/null +++ b/src/lookups/lcshared_suggest2.js @@ -0,0 +1,167 @@ +bfe.define('src/lookups/lcshared_suggest2', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { + // require('https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.js'); + + /* + subjecturi propertyuri selected.uri + selected.uri bf:label selected.value + */ + var bfelog = require('src/bfelogging'); + + var addLiteralOption = function (data, query){ + data.push({uri: "_:b1", id: "literal", value: query, display: query + "(Literal Value)"}); + }; + + exports.processSuggestions = function (suggestions, query) { + bfelog.addMsg(new Error(), 'DEBUG','Processing suggestions: ', suggestions); + var typeahead_source = []; + if (suggestions.count !== undefined) { + for (var s = 0; s < suggestions.hits.length; s++) { + var hit = suggestions.hits[s]; + + var l = hit.suggestLabel; + var al = hit.aLabel; + var u = hit.uri; + var id = u.replace(/.+\/(.+)/, '$1'); + var d = l + ' (' + id + ')'; + if (id.length==32){ + d = l; + } + li = al; + + // What the heck is this? + /* + if (suggestions.length === 5) { + var i = suggestions[4][s]; + var li = l + ' (' + i + ')'; + } else { + li = l; + } + */ + + typeahead_source.push({ + uri: u, + id: id, + value: li, + display: d + }); + } + } + + if (typeahead_source.length === 0) { + typeahead_source[0] = { + uri: '', + display: '[No suggestions found for ' + query + '.]' + }; + } + addLiteralOption(typeahead_source, query); + return typeahead_source; + }; + + exports.suggest2Query = function (query, cache, scheme, processSync, processAsync, formobject) { + bfelog.addMsg(new Error(), 'DEBUG','Suggest2 query'); + bfelog.addMsg(new Error(), 'DEBUG','q is ' + query); + + var lcshared = require('src/lookups/lcshared'); + if (!_.isEmpty(formobject)){ + var triples = formobject.store; + + var type = ''; + var hits = _.where(triples, { + 'p': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' + }); + if (hits[0] !== undefined) { + type = hits[0].o; + } + + var rdftype = lcshared.rdfType(type); + var q = ''; + if (scheme !== '' && rdftype !== '') { + q = 'cs:' + scheme + ' AND ' + rdftype; + } else if (rdftype !== '') { + q = rdftype; + } else if (scheme !== '') { + q = 'cs:' + scheme; + } + + if (q !== '') { + q = q + ' AND ' + query.replace('?', '').normalize() + '*'; + } else { + q = query.normalize(); + } + } else { + q = query.normalize(); + } + + if (cache[q]) { + processSync(cache[q]); + return; + } + if (typeof this.searching !== 'undefined') { + clearTimeout(this.searching); + processSync([]); + } + this.searching = setTimeout(function () { + if (query === '' || query === ' ') { + // If the query is empty or a simple space. + var u = scheme + '/suggest2/?count=50&q='; + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'jsonp', + success: function (data) { + var parsedlist = processSuggestions(data, ''); + return processAsync(parsedlist); + } + }); + } else if (query.length > 2 && query.substr(0, 1) == '?') { + // If the search string begins with a question mark. + u = 'http://id.loc.gov/search/?format=jsonp&start=1&count=50&q=' + q; + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'jsonp', + success: function (data) { + var parsedlist = exports.processATOM(data, query); + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } else if ( + query.length >= 2 && + ( query.match(/^[A-Za-z\s]{0,3}[0-9]{3,}$/) || query.match(/^[A-Za-z]{0,2}[0-9]{2,}$/) ) + ) { + if ( query.match(/^[0-9]{3,}$/) || query.match(/^[A-Za-z]{0,2}[0-9]{2,}$/) ) { + u = scheme + '/suggest/lccn/' + query.replace(/\s/g,''); + } else { + u = scheme + '/suggest/token/' + query.replace(/\s/g,''); + } + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'json', + success: function (data) { + var parsedlist = processSuggestions(data, query); + cache[q] = parsedlist; + return processAsync(parsedlist); + }, + fail: function (err){ + bfelog.addMsg(new Error(), 'INFO',err); + } + }); + } else if (query.length >= 1) { + u = scheme + '/suggest2/?count=50&q=' + query; + u = u.replace(/^(http:)/,""); + $.ajax({ + url: encodeURI(u), + dataType: 'jsonp', + success: function (data) { + var parsedlist = exports.processSuggestions(data, query); + cache[q] = parsedlist; + return processAsync(parsedlist); + } + }); + } + }, 300); // 300 ms + } + +}); \ No newline at end of file diff --git a/src/lookups/names-preprod.js b/src/lookups/names-preprod.js index 9cafeb3..bcbef20 100644 --- a/src/lookups/names-preprod.js +++ b/src/lookups/names-preprod.js @@ -1,5 +1,6 @@ -bfe.define('src/lookups/lcnames-preprod', ['require', 'exports', 'src/lookups/lcshared', 'src/bfelogging'], function (require, exports) { +bfe.define('src/lookups/lcnames-preprod', ['require', 'exports', 'src/lookups/lcshared', 'src/lookups/lcshared_suggest2', 'src/bfelogging'], function (require, exports) { var lcshared = require('src/lookups/lcshared'); + var suggest2 = require('src/lookups/lcshared_suggest2'); var bfelog = require('src/bfelogging'); var cache = {}; @@ -55,13 +56,13 @@ bfe.define('src/lookups/lcnames-preprod', ['require', 'exports', 'src/lookups/lc bfelog.addMsg(new Error(), 'INFO',query); if (rdftype !== '') { suggestquery += '&rdftype=' + rdftype.replace('rdftype:', ''); } - var u = exports.scheme + '/suggest/?q=' + suggestquery + '&count=50'; + var u = exports.scheme + '/suggest2/?q=' + suggestquery + '&count=50'; u = u.replace(/^(http:)/,""); $.ajax({ url: u, dataType: 'jsonp', success: function (data) { - var parsedlist = lcshared.processSuggestions(data, query); + var parsedlist = suggest2.processSuggestions(data, query); cache[q] = parsedlist; return processAsync(parsedlist); } diff --git a/test.html b/test.html index 926ddfa..b6f1db2 100755 --- a/test.html +++ b/test.html @@ -67,6 +67,8 @@ + + From eba9042cd3af990ce7bc404c7de611560e58306b Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 2 Apr 2021 16:36:13 -0400 Subject: [PATCH 14/32] Use suggest1 for resources, for now. --- src/bfe.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bfe.js b/src/bfe.js index 64045f0..b164947 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -4931,7 +4931,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' lu.name = scheme.substr(scheme.lastIndexOf('/') + 1); lu.load = {}; lu.load.scheme = scheme; - if ( scheme.indexOf('id.loc.gov') > 0 ) { + if ( scheme.indexOf('id.loc.gov') > 0 && !scheme.match(/(resources)/) ) { var suggest2 = require('src/lookups/lcshared_suggest2'); lu.load.source = function (query, processSync, processAsync) { return suggest2.suggest2Query(query, cache, scheme, processSync, processAsync); From e158ea20ccc0c41822b26f6fb7c383c73ead3fd1 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 2 Apr 2021 16:50:08 -0400 Subject: [PATCH 15/32] Add lcshared js to build. --- Gruntfile.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Gruntfile.js b/Gruntfile.js index a6a1407..dfd73ba 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -16,6 +16,8 @@ module.exports = function(grunt) { 'src/bfeliterallang.js', 'src/lookups/lcshared.js', + 'src/lookups/lcshared_suggest1.js', + 'src/lookups/lcshared_suggest2.js', 'src/bfelookups.js', 'src/lookups/names-preprod.js', @@ -43,6 +45,8 @@ module.exports = function(grunt) { 'src/bfeliterallang.js', 'src/lookups/lcshared.js', + 'src/lookups/lcshared_suggest1.js', + 'src/lookups/lcshared_suggest2.js', 'src/bfelookups.js', 'src/lookups/names-preprod.js', From 42b6be286885670c272da70e63b9cda76bc762cf Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 2 Apr 2021 17:06:57 -0400 Subject: [PATCH 16/32] Use square brackets around the identifier. Too confusing with all the parens. --- src/lookups/lcshared_suggest2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lookups/lcshared_suggest2.js b/src/lookups/lcshared_suggest2.js index a17f5c1..9cf70f2 100644 --- a/src/lookups/lcshared_suggest2.js +++ b/src/lookups/lcshared_suggest2.js @@ -22,7 +22,7 @@ bfe.define('src/lookups/lcshared_suggest2', ['require', 'exports', 'src/lookups/ var al = hit.aLabel; var u = hit.uri; var id = u.replace(/.+\/(.+)/, '$1'); - var d = l + ' (' + id + ')'; + var d = l + ' [' + id + ']'; if (id.length==32){ d = l; } From 71a7b73599470a8afc6d0a0321931e7a7ea5442c Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 9 Apr 2021 16:46:54 -0400 Subject: [PATCH 17/32] Use suggest2 service for keyword search. --- src/lookups/lcshared_suggest2.js | 13 +++++++------ src/lookups/names-preprod.js | 7 ++++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/lookups/lcshared_suggest2.js b/src/lookups/lcshared_suggest2.js index 9cf70f2..bbfb707 100644 --- a/src/lookups/lcshared_suggest2.js +++ b/src/lookups/lcshared_suggest2.js @@ -86,10 +86,10 @@ bfe.define('src/lookups/lcshared_suggest2', ['require', 'exports', 'src/lookups/ if (q !== '') { q = q + ' AND ' + query.replace('?', '').normalize() + '*'; } else { - q = query.normalize(); + q = query.replace('?', '').normalize(); } } else { - q = query.normalize(); + q = query.replace('?', '').normalize(); } if (cache[q]) { @@ -109,19 +109,20 @@ bfe.define('src/lookups/lcshared_suggest2', ['require', 'exports', 'src/lookups/ url: encodeURI(u), dataType: 'jsonp', success: function (data) { - var parsedlist = processSuggestions(data, ''); + var parsedlist = exports.processSuggestions(data, ''); return processAsync(parsedlist); } }); } else if (query.length > 2 && query.substr(0, 1) == '?') { // If the search string begins with a question mark. - u = 'http://id.loc.gov/search/?format=jsonp&start=1&count=50&q=' + q; + u = scheme + '/suggest2/?q=' + q + '&searchtype=keyword&count=50'; + console.log(u); u = u.replace(/^(http:)/,""); $.ajax({ url: encodeURI(u), dataType: 'jsonp', success: function (data) { - var parsedlist = exports.processATOM(data, query); + var parsedlist = exports.processSuggestions(data, query); cache[q] = parsedlist; return processAsync(parsedlist); } @@ -140,7 +141,7 @@ bfe.define('src/lookups/lcshared_suggest2', ['require', 'exports', 'src/lookups/ url: encodeURI(u), dataType: 'json', success: function (data) { - var parsedlist = processSuggestions(data, query); + var parsedlist = exports.processSuggestions(data, query); cache[q] = parsedlist; return processAsync(parsedlist); }, diff --git a/src/lookups/names-preprod.js b/src/lookups/names-preprod.js index bcbef20..52a9307 100644 --- a/src/lookups/names-preprod.js +++ b/src/lookups/names-preprod.js @@ -68,16 +68,17 @@ bfe.define('src/lookups/lcnames-preprod', ['require', 'exports', 'src/lookups/lc } }); } else if (query.length > 2) { + q = query; if (query.match(/^[Nn][A-z\s]{0,1}\d/)){ q = query.replace(/\s+/g,'').normalize(); - } - u = schemeBaseURL + '/search/?format=jsonp&start=1&count=50&q=' + q.replace('?', ''); + } + u = exports.scheme + '/suggest2/?q=' + q.replace('?', '') + '&searchtype=keyword&count=50'; u = u.replace(/^(http:)/,""); $.ajax({ url: u, dataType: 'jsonp', success: function (data) { - var parsedlist = lcshared.processATOM(data, query); + var parsedlist = suggest2.processSuggestions(data, query); cache[q] = parsedlist; return processAsync(parsedlist); } From 392d5d608bb089bc0a87dced5a3c61bf646b6066 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Wed, 21 Apr 2021 17:33:54 -0400 Subject: [PATCH 18/32] Attempt at a more human view. --- src/bfe.js | 21 +++++++-- src/bfestore.js | 116 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 132 insertions(+), 5 deletions(-) diff --git a/src/bfe.js b/src/bfe.js index b164947..bcb7cbf 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -1723,12 +1723,12 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' // bfeditor.bfestore.store2turtle(jsonstr, humanizedPanel); bfeditor.bfestore.store2jsonldcompacted(jsonstr, jsonPanel); - function humanizedPanel(data) { - $('#humanized pre').text(data); + function turtlePanel(data) { + $('#turtle pre').text(data); } function jsonPanel(data) { - bfestore.store2turtle(data, humanizedPanel); + bfestore.store2turtle(data, turtlePanel); $('#jsonld pre').text(JSON.stringify(data, undefined, ' ')); @@ -1742,7 +1742,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' }); } } - + document.body.scrollTop = document.documentElement.scrollTop = 0; var $backButton = $(''); @@ -1757,6 +1757,15 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' \ \ \ +
\ +
\ +

Turtle

\ +
\ +
 \
+                                        
\ +
\ +
\ + \
\
\

JSONLD

\ @@ -1794,6 +1803,10 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' $('#bfeditor-formdiv').hide(); $bfeditor.append($preview); + + var humanStr = bfestore.store2text(); + $('#humanized pre').text(humanStr); + }); $('#bfeditor-exitpreview').attr('tabindex', tabIndices++); diff --git a/src/bfestore.js b/src/bfestore.js index 6940615..b555397 100755 --- a/src/bfestore.js +++ b/src/bfestore.js @@ -613,6 +613,120 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { } return json; }; + + function recurseJSONLDexpanded(uri, level, json, linkingProperty = "") { + var nl = "\n"; + var space = " "; + var nlindent = nl + space; + for (i = 0; i < level; i++) { + nlindent += space; + } + var nlindentindent = nl + space + space; + for (i = 0; i < level; i++) { + nlindentindent += space; + } + var predata = ""; + var resources = _.filter(json, function(r) { return r["@id"] == uri; }); + if (resources.length === 0) { + // This might be a URI reference but no additional data is present. + // Let's treat it as an rdfs:resource reference. + if ( !uri.startsWith("_:") ) { + predata += nlindent + "ID: " + uri; + } + } + // The things is, there should only be 1. This is probably safer... + resources.forEach(function(resource) { + if (level === 0) { + predata += nl + "ID: " + resource["@id"]; + } else if ( !resource["@id"].startsWith("_:") ) { + predata += nlindent + "ID: " + resource["@id"]; + } + if (resource["@type"] !== undefined) { + var types = []; + resource["@type"].forEach(function(t) { + if (t["@id"] !== undefined) { + var val = t["@id"]; + } else { + val = t; + } + val = val.replace("http://id.loc.gov/ontologies/bibframe/", "bf:"); + val = val.replace("http://id.loc.gov/ontologies/bflc/", "bflc:"); + types.push(val); + }); + var typesStr = types.join(' '); + var typePropMatch = true; + if ( linkingProperty == "" || typesStr.toLowerCase().indexOf( linkingProperty.toLowerCase() ) === -1 ) { + typePropMatch = false; + } + if ( !typePropMatch ) { + predata += nlindent + "Type(s): "; + predata += nlindentindent + typesStr; + } + } + skip_properties = [ + "http://www.w3.org/2000/01/rdf-schema#label", + "http://www.w3.org/1999/02/22-rdf-syntax-ns#value", + "http://id.loc.gov/ontologies/bibframe/code" + ]; + var label = ""; + if ( resource["http://www.w3.org/2000/01/rdf-schema#label"] !== undefined ) { + label = resource["http://www.w3.org/2000/01/rdf-schema#label"][0]["@value"]; + } else if ( resource["http://id.loc.gov/ontologies/bibframe/code"] !== undefined ) { + label = resource["http://id.loc.gov/ontologies/bibframe/code"][0]["@value"]; + } else if ( resource["http://www.w3.org/1999/02/22-rdf-syntax-ns#value"] !== undefined ) { + label = resource["http://www.w3.org/1999/02/22-rdf-syntax-ns#value"][0]["@value"]; + } + if (label != "") { + predata += nlindent + "Label"; + predata += nlindentindent + label; + } + for (var t in resource) { + if ( skip_properties.indexOf(t) === -1 ) { + if (t !== "@type" && t !== "@id") { + var prop = t.replace("http://id.loc.gov/ontologies/bibframe/", "bf:"); + prop = prop.replace("http://id.loc.gov/ontologies/bflc/", "bflc:"); + prop = prop.replace("http://www.w3.org/2000/01/rdf-schema#", "rdfs:"); + prop = prop.replace("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf:"); + prop = prop.replace("http://www.loc.gov/mads/rdf/v1#", "madsrdf:"); + predata += nlindent + prop; + if (resource[t]["@list"] !== undefined) { + resource[t]["@list"].forEach(function(o) { + if (o["@id"] !== undefined) { + predata += nlindentindent + "*)" + predata += recurseJSONLDexpanded(o["@id"], level + 3, json, prop); + } else { + predata += nlindentindent + o["@value"]; + if (resource.length > 1) { + predata += nl; + } + } + }); + } else { + resource[t].forEach(function(o) { + if (o["@id"] !== undefined) { + predata += recurseJSONLDexpanded(o["@id"], level + 1, json, prop); + } else { + predata += nlindentindent + o["@value"]; + if (resource.length > 1) { + predata += nl; + } + } + }); + } + } + } + } + }); + return predata; + }; + + exports.store2text = function() { + var predata = ""; + var json = exports.store2jsonldExpanded(); + var uri = this.defaulturi; + predata += recurseJSONLDexpanded(uri, 0, json); + return predata; + } exports.store2turtle = function (jsonstr, callback) { jsonld.toRDF(jsonstr, { @@ -645,7 +759,7 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { callback(result); }); var input = {}; - input.n3 = $("#humanized pre").text().normalize("NFC"); + input.n3 = $("#turtle pre").text().normalize("NFC"); $.ajax({ url: "/profile-edit/server/n3/rdfxml", type: "POST", From e8bf5cb1baf116fa81c0b77ed3828b4c611a66da Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Thu, 22 Apr 2021 08:51:17 -0400 Subject: [PATCH 19/32] Added some new namespaces to convert to prefixes; repeat property before every resource. --- src/bfestore.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/bfestore.js b/src/bfestore.js index b555397..31a1cee 100755 --- a/src/bfestore.js +++ b/src/bfestore.js @@ -651,6 +651,8 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { } val = val.replace("http://id.loc.gov/ontologies/bibframe/", "bf:"); val = val.replace("http://id.loc.gov/ontologies/bflc/", "bflc:"); + val = val.replace("http://performedmusicontology.org/ontology/", "pmo:"); + val = val.replace("http://www.loc.gov/mads/rdf/v1#", "madsrdf:"); types.push(val); }); var typesStr = types.join(' '); @@ -688,9 +690,10 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { prop = prop.replace("http://www.w3.org/2000/01/rdf-schema#", "rdfs:"); prop = prop.replace("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf:"); prop = prop.replace("http://www.loc.gov/mads/rdf/v1#", "madsrdf:"); - predata += nlindent + prop; + prop = prop.replace("http://performedmusicontology.org/ontology/", "pmo:"); if (resource[t]["@list"] !== undefined) { resource[t]["@list"].forEach(function(o) { + predata += nlindent + prop; if (o["@id"] !== undefined) { predata += nlindentindent + "*)" predata += recurseJSONLDexpanded(o["@id"], level + 3, json, prop); @@ -703,6 +706,7 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { }); } else { resource[t].forEach(function(o) { + predata += nlindent + prop; if (o["@id"] !== undefined) { predata += recurseJSONLDexpanded(o["@id"], level + 1, json, prop); } else { From a7f7014ab78ed2349db07e9f0465859363f84a62 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 23 Apr 2021 14:13:34 -0400 Subject: [PATCH 20/32] Loads of logging statements trying to fix deletion issue. --- src/bfe.js | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/bfe.js b/src/bfe.js index bcb7cbf..3432357 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -4727,7 +4727,10 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' $(input).parent().siblings('.typeaheadpage').val(1); //var resourceid = $(form).children('div').eq(0).attr('id'); var resourceURI = $(form).find('div[data-uri]').eq(0).attr('data-uri'); + bfelog.addMsg(new Error(), 'DEBUG', 'resourceURI for typeahead selection is ' + resourceURI); + bfelog.addMsg(new Error(), 'DEBUG', 'event.target.id is ' + event.target.id); + //bfelog.addMsg(new Error(), 'DEBUG', 'form is ', form); var propertyguid = $('#' + event.target.id).attr('data-propertyguid'); bfelog.addMsg(new Error(), 'DEBUG', 'propertyguid for typeahead input is ' + propertyguid); @@ -5075,20 +5078,21 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' formobject = formobject[0]; if ($('#' + t.guid).length && t !== undefined) { - bfelog.addMsg(new Error(), 'DEBUG', 'Removing triple: ' + t.guid, t); + bfelog.addMsg(new Error(), 'DEBUG', 'Removing dispay component related to triple: ' + t.guid, t); // $("#" + t.guid).empty(); $('#' + t.guid).remove(); } else if ($('#' + tguid).length){ - bfelog.addMsg(new Error(), 'DEBUG', 'Removing triple: ' + tguid, null); + bfelog.addMsg(new Error(), 'DEBUG', 'This does nothing in removing triple? ' + tguid, null); //$('#' + tguid).remove(); } if (!_.isEmpty(t.guid)) { - bfelog.addMsg(new Error(), 'DEBUG', 'Removing triple: ' + t.guid); + bfelog.addMsg(new Error(), 'DEBUG', 'Removing triple from form object: ' + t.guid); formobject.store = _.without(formobject.store, _.findWhere(formobject.store, { guid: t.guid })); + bfelog.addMsg(new Error(), 'DEBUG', 'Removing triple from store: ' + t.guid); bfestore.store = _.without(bfestore.store, _.findWhere(bfestore.store, { guid: t.guid })); @@ -5103,6 +5107,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' bfelog.addMsg(new Error(), 'DEBUG', 'Missing guid - formobjectID: ' + formobjectID + ' inputID: ' + inputID + ' tguid' + tguid, t); } + // Reset the input box so it is enabled and transparent. var $el = $('#' + inputID, formobject.form); if ($el.is('input') && $el.hasClass('typeahead')) { var $inputs = $('#' + inputID, formobject.form).parent().find("input[data-propertyguid='" + inputID + "']"); @@ -5122,21 +5127,23 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' $(this).prop('disabled', false); }); } - /*formobject.store = _.without(formobject.store, _.findWhere(formobject.store, { - guid: t.guid - })); - bfestore.store = _.without(bfestore.store, _.findWhere(bfestore.store, { - guid: t.guid - }));*/ $('#bfeditor-debug').html(JSON.stringify(bfestore.store, undefined, ' ')); } function removeTriples(formobjectID, inputID, tID, triples) { - bfelog.addMsg(new Error(), 'DEBUG', 'Removing triples for formobjectID: ' + formobjectID + ' and inputID: ' + inputID, triples); + var formobject = _.where(forms, { + 'id': formobjectID + }); + formobject = formobject[0]; + bfelog.addMsg(new Error(), 'DEBUG', 'formobject store, priro to triple removal:', formobject.store); + bfelog.addMsg(new Error(), 'DEBUG', 'Removing triples for formobjectID: ' + formobjectID + ' and inputID: ' + inputID); + bfelog.addMsg(new Error(), 'DEBUG', 'Triples to be removed: ', triples); triples.forEach(function (triple) { removeTriple(formobjectID, inputID, tID, triple); }); + bfelog.addMsg(new Error(), 'DEBUG', 'Current store, after triple removal:', bfestore.store); + bfelog.addMsg(new Error(), 'DEBUG', 'Current formobject store, after triple removal:', formobject.store); } /** From a9940f2fc3d265cf04976e3b28c3b40e28a7ec2a Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 23 Apr 2021 14:39:23 -0400 Subject: [PATCH 21/32] Use numbers to indicate list items; tighten up display by putting values on same line as property; ID to URI; refactor namepspace/prefix replacement. --- src/bfestore.js | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/bfestore.js b/src/bfestore.js index 31a1cee..1d38f66 100755 --- a/src/bfestore.js +++ b/src/bfestore.js @@ -613,7 +613,17 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { } return json; }; - + + function replaceNS(ns) { + ns = ns.replace("http://id.loc.gov/ontologies/bibframe/", "bf:"); + ns = ns.replace("http://id.loc.gov/ontologies/bflc/", "bflc:"); + ns = ns.replace("http://www.w3.org/2000/01/rdf-schema#", "rdfs:"); + ns = ns.replace("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf:"); + ns = ns.replace("http://www.loc.gov/mads/rdf/v1#", "madsrdf:"); + ns = ns.replace("http://performedmusicontology.org/ontology/", "pmo:"); + return ns; + }; + function recurseJSONLDexpanded(uri, level, json, linkingProperty = "") { var nl = "\n"; var space = " "; @@ -631,15 +641,15 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { // This might be a URI reference but no additional data is present. // Let's treat it as an rdfs:resource reference. if ( !uri.startsWith("_:") ) { - predata += nlindent + "ID: " + uri; + predata += nlindent + "URI -- " + uri; } } // The things is, there should only be 1. This is probably safer... resources.forEach(function(resource) { if (level === 0) { - predata += nl + "ID: " + resource["@id"]; + predata += nl + "URI -- " + resource["@id"]; } else if ( !resource["@id"].startsWith("_:") ) { - predata += nlindent + "ID: " + resource["@id"]; + predata += nlindent + "URI -- " + resource["@id"]; } if (resource["@type"] !== undefined) { var types = []; @@ -649,10 +659,7 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { } else { val = t; } - val = val.replace("http://id.loc.gov/ontologies/bibframe/", "bf:"); - val = val.replace("http://id.loc.gov/ontologies/bflc/", "bflc:"); - val = val.replace("http://performedmusicontology.org/ontology/", "pmo:"); - val = val.replace("http://www.loc.gov/mads/rdf/v1#", "madsrdf:"); + val = replaceNS(val); types.push(val); }); var typesStr = types.join(' '); @@ -661,14 +668,14 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { typePropMatch = false; } if ( !typePropMatch ) { - predata += nlindent + "Type(s): "; - predata += nlindentindent + typesStr; + predata += nlindent + "Type(s) -- " + typesStr; } } skip_properties = [ "http://www.w3.org/2000/01/rdf-schema#label", "http://www.w3.org/1999/02/22-rdf-syntax-ns#value", - "http://id.loc.gov/ontologies/bibframe/code" + "http://id.loc.gov/ontologies/bibframe/code", + "http://id.loc.gov/ontologies/bibframe/adminMetadata" ]; var label = ""; if ( resource["http://www.w3.org/2000/01/rdf-schema#label"] !== undefined ) { @@ -679,26 +686,22 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { label = resource["http://www.w3.org/1999/02/22-rdf-syntax-ns#value"][0]["@value"]; } if (label != "") { - predata += nlindent + "Label"; - predata += nlindentindent + label; + predata += nlindent + "Label -- " + label; } for (var t in resource) { if ( skip_properties.indexOf(t) === -1 ) { if (t !== "@type" && t !== "@id") { - var prop = t.replace("http://id.loc.gov/ontologies/bibframe/", "bf:"); - prop = prop.replace("http://id.loc.gov/ontologies/bflc/", "bflc:"); - prop = prop.replace("http://www.w3.org/2000/01/rdf-schema#", "rdfs:"); - prop = prop.replace("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf:"); - prop = prop.replace("http://www.loc.gov/mads/rdf/v1#", "madsrdf:"); - prop = prop.replace("http://performedmusicontology.org/ontology/", "pmo:"); + var prop = replaceNS(t); if (resource[t]["@list"] !== undefined) { + var count = 1; + predata += nlindent + prop; resource[t]["@list"].forEach(function(o) { - predata += nlindent + prop; if (o["@id"] !== undefined) { - predata += nlindentindent + "*)" + predata += nlindentindent + count + ")"; + count++; predata += recurseJSONLDexpanded(o["@id"], level + 3, json, prop); } else { - predata += nlindentindent + o["@value"]; + predata += " -- " + o["@value"]; if (resource.length > 1) { predata += nl; } @@ -710,7 +713,7 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { if (o["@id"] !== undefined) { predata += recurseJSONLDexpanded(o["@id"], level + 1, json, prop); } else { - predata += nlindentindent + o["@value"]; + predata += " -- " + o["@value"]; if (resource.length > 1) { predata += nl; } From 570df4c153d0dcf55cf8d6e0b280cb7668e9ec20 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 23 Apr 2021 14:39:56 -0400 Subject: [PATCH 22/32] Don't ignore adminMetadata, left over from bad idea. --- src/bfestore.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/bfestore.js b/src/bfestore.js index 1d38f66..8de8f69 100755 --- a/src/bfestore.js +++ b/src/bfestore.js @@ -674,8 +674,7 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { skip_properties = [ "http://www.w3.org/2000/01/rdf-schema#label", "http://www.w3.org/1999/02/22-rdf-syntax-ns#value", - "http://id.loc.gov/ontologies/bibframe/code", - "http://id.loc.gov/ontologies/bibframe/adminMetadata" + "http://id.loc.gov/ontologies/bibframe/code" ]; var label = ""; if ( resource["http://www.w3.org/2000/01/rdf-schema#label"] !== undefined ) { From cb018360f0bc687d6628fc9b7378a185315b08c2 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 23 Apr 2021 16:27:00 -0400 Subject: [PATCH 23/32] Does property match the class exactly? If not, display type. --- src/bfestore.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bfestore.js b/src/bfestore.js index 8de8f69..df18d13 100755 --- a/src/bfestore.js +++ b/src/bfestore.js @@ -664,7 +664,8 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { }); var typesStr = types.join(' '); var typePropMatch = true; - if ( linkingProperty == "" || typesStr.toLowerCase().indexOf( linkingProperty.toLowerCase() ) === -1 ) { + //if ( linkingProperty == "" || typesStr.toLowerCase().indexOf( linkingProperty.toLowerCase() ) === -1 ) { + if ( linkingProperty == "" || typesStr.toLowerCase() != linkingProperty.toLowerCase() ) { typePropMatch = false; } if ( !typePropMatch ) { From e771d47941f5b053738bb752ecd4fa4cdb5118e9 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Fri, 23 Apr 2021 17:05:39 -0400 Subject: [PATCH 24/32] Demarcate Works, Instances, and Items. --- src/bfestore.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/bfestore.js b/src/bfestore.js index df18d13..c8dde49 100755 --- a/src/bfestore.js +++ b/src/bfestore.js @@ -664,7 +664,6 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { }); var typesStr = types.join(' '); var typePropMatch = true; - //if ( linkingProperty == "" || typesStr.toLowerCase().indexOf( linkingProperty.toLowerCase() ) === -1 ) { if ( linkingProperty == "" || typesStr.toLowerCase() != linkingProperty.toLowerCase() ) { typePropMatch = false; } @@ -688,6 +687,11 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { if (label != "") { predata += nlindent + "Label -- " + label; } + var demarcateProps = { + "bf:hasInstance": "Instance", + "bf:hasItem": "Item", + "bf:instanceOf": "Work" + }; for (var t in resource) { if ( skip_properties.indexOf(t) === -1 ) { if (t !== "@type" && t !== "@id") { @@ -709,6 +713,9 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { }); } else { resource[t].forEach(function(o) { + if ( demarcateProps[prop] !== undefined ) { + predata += nlindent + "--------------- Begin " + demarcateProps[prop] + " ---------------"; + } predata += nlindent + prop; if (o["@id"] !== undefined) { predata += recurseJSONLDexpanded(o["@id"], level + 1, json, prop); @@ -718,7 +725,11 @@ bfe.define('src/bfestore', ['require', 'exports'], function (require, exports) { predata += nl; } } + if ( demarcateProps[prop] !== undefined ) { + predata += nlindent + "--------------- End " + demarcateProps[prop] + " ---------------"; + } }); + } } } From c3ed30e1fb2f31442292b788a3043406a00984ba Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Tue, 11 May 2021 16:37:53 -0400 Subject: [PATCH 25/32] Output collections, see references, and related authorities in pop out. --- src/bfe.js | 24 +++++++++++++++++++++++- src/lookups/lcshared.js | 25 ++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/bfe.js b/src/bfe.js index 3432357..bba7c85 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -1,4 +1,5 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', 'src/bfeapi', 'src/bfelabels', 'src/lib/aceconfig'], function (require, exports) { + var editorconfig = {}; var bfestore = require('src/bfestore'); var bfelog = require('src/bfelogging'); @@ -4601,6 +4602,13 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' }); html = html + ''; } + if (data.nodeMap.collections && data.nodeMap.collections.length > 0) { + html = html + '
Collections
    '; + data.nodeMap.collections.forEach(function (c) { + html = html + '
  • ' + c + '
  • '; + }); + html = html + '
'; + } if (data.nodeMap.hasBroaderAuthority && data.nodeMap.hasBroaderAuthority.length > 0) { html = html + '
Broader
    '; data.nodeMap.hasBroaderAuthority.forEach(function (c) { @@ -4614,7 +4622,21 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' html = html + '
  • ' + c + '
  • '; }); html = html + '
'; - } + } + if (data.nodeMap.see && data.nodeMap.see.length > 0) { + html = html + '
See Also
    '; + data.nodeMap.see.forEach(function (c) { + html = html + '
  • ' + c + '
  • '; + }); + html = html + '
'; + } + if (data.nodeMap.hasRelatedAuthority && data.nodeMap.hasRelatedAuthority.length > 0) { + html = html + '
Related Authority
    '; + data.nodeMap.hasRelatedAuthority.forEach(function (c) { + html = html + '
  • ' + c + '
  • '; + }); + html = html + '
'; + } html = html + '
' return html; diff --git a/src/lookups/lcshared.js b/src/lookups/lcshared.js index af810a1..192526f 100644 --- a/src/lookups/lcshared.js +++ b/src/lookups/lcshared.js @@ -113,6 +113,12 @@ bfe.define('src/lookups/lcshared', ['require', 'exports', 'src/bfelogging'], fun } if (n['http://www.loc.gov/mads/rdf/v1#hasNarrowerAuthority']){ nodeMap.hasNarrowerAuthority = n['http://www.loc.gov/mads/rdf/v1#hasNarrowerAuthority'].map(function(d){ return d['@id']}) + } + if (n['http://www.loc.gov/mads/rdf/v1#see']){ + nodeMap.see = n['http://www.loc.gov/mads/rdf/v1#see'].map(function(d){ return d['@id']}) + } + if (n['http://www.loc.gov/mads/rdf/v1#hasRelatedAuthority']){ + nodeMap.hasRelatedAuthority = n['http://www.loc.gov/mads/rdf/v1#hasRelatedAuthority'].map(function(d){ return d['@id']}) } }) @@ -186,6 +192,24 @@ bfe.define('src/lookups/lcshared', ['require', 'exports', 'src/bfelogging'], fun results.genreForm = n['rdf-schema:label']; } } + + if (n['http://www.loc.gov/mads/rdf/v1#isMemberOfMADSCollection']) { + results.nodeMap.collections = []; + n['http://www.loc.gov/mads/rdf/v1#isMemberOfMADSCollection'].forEach(function(val){ + if (val['@id']) { + var coll_label_parts = val['@id'].split("_"); + var coll_label = coll_label_parts[1]; + if (coll_label_parts.length > 2) { + coll_label = coll_label_parts.slice(1).join(' '); + } + if (coll_label != "LCNAF" && coll_label.match(/[A-Z]{4}|[A-Z][a-z]+/g)) { + coll_label = coll_label.match(/[A-Z]{4}|[A-Z][a-z]+/g).join(" "); + } + results.nodeMap.collections.push(coll_label); + } + }) + } + }); return results; } @@ -202,7 +226,6 @@ bfe.define('src/lookups/lcshared', ['require', 'exports', 'src/bfelogging'], fun jsonuri = jsonuri.replace(/^(http:)/,"https:"); } - $.ajax({ url: jsonuri, dataType: 'json', From 565e27b34cadd6af76058b52f3a8b6b149e90c7b Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Mon, 17 May 2021 17:53:59 -0400 Subject: [PATCH 26/32] Citation- to camelcase. --- src/lookups/lcshared.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lookups/lcshared.js b/src/lookups/lcshared.js index 192526f..bf57366 100644 --- a/src/lookups/lcshared.js +++ b/src/lookups/lcshared.js @@ -156,14 +156,14 @@ bfe.define('src/lookups/lcshared', ['require', 'exports', 'src/bfelogging'], fun var citation = ''; var variant = ''; - if (n['http://www.loc.gov/mads/rdf/v1#citation-source']) { - citation = citation + n['http://www.loc.gov/mads/rdf/v1#citation-source'].map(function (v) { return v['@value'] + ' '; }) + if (n['http://www.loc.gov/mads/rdf/v1#citationSource']) { + citation = citation + n['http://www.loc.gov/mads/rdf/v1#citationSource'].map(function (v) { return v['@value'] + ' '; }) } - if (n['http://www.loc.gov/mads/rdf/v1#citation-note']) { - citation = citation + n['http://www.loc.gov/mads/rdf/v1#citation-note'].map(function (v) { return v['@value'] + ' '; }) + if (n['http://www.loc.gov/mads/rdf/v1#citationNote']) { + citation = citation + n['http://www.loc.gov/mads/rdf/v1#citationNote'].map(function (v) { return v['@value'] + ' '; }) } - if (n['http://www.loc.gov/mads/rdf/v1#citation-status']) { - citation = citation + n['http://www.loc.gov/mads/rdf/v1#citation-status'].map(function (v) { return v['@value'] + ' '; }) + if (n['http://www.loc.gov/mads/rdf/v1#citationStatus']) { + citation = citation + n['http://www.loc.gov/mads/rdf/v1#citationStatus'].map(function (v) { return v['@value'] + ' '; }) } if (n['http://www.loc.gov/mads/rdf/v1#variantLabel']) { variant = variant + n['http://www.loc.gov/mads/rdf/v1#variantLabel'].map(function (v) { return v['@value'] + ' '; }) From 4bd6ae0c40a0e0f93eb7c26da6cb1a9c3eaa8011 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Mon, 7 Jun 2021 15:17:12 -0400 Subject: [PATCH 27/32] Add validation for Names and Subjects. --- development.html | 2 +- src/bfe.js | 169 +++++++++++++++++++++++++++++++++++++++++++++++ src/bfelabels.js | 37 +++++++++++ 3 files changed, 207 insertions(+), 1 deletion(-) diff --git a/development.html b/development.html index 51845f3..934a889 100755 --- a/development.html +++ b/development.html @@ -75,7 +75,7 @@ - + diff --git a/src/bfe.js b/src/bfe.js index bba7c85..2d3a37b 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -1,5 +1,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', 'src/bfeapi', 'src/bfelabels', 'src/lib/aceconfig'], function (require, exports) { + //sessionStorage.clear(); + var editorconfig = {}; var bfestore = require('src/bfestore'); var bfelog = require('src/bfelogging'); @@ -3131,6 +3133,146 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' } bfelog.addMsg(new Error(), 'DEBUG', 'displayData is: ' + displaydata); + + var displayResourceURI; + var idInfo = {}; + var displayResource = _.where(bfestore.store, { + 's': pd.o + }); + bfelog.addMsg(new Error(), 'DEBUG', 'displayResource is: ', displayResource); + if ( property.propertyURI == "http://id.loc.gov/ontologies/bibframe/contribution" ) { + var agentUri = _.find(displayResource, { + p: "http://id.loc.gov/ontologies/bibframe/agent" + }); + if ( + !_.isEmpty(agentUri) && + !agentUri.o.startsWith("_:b") && + agentUri.o.indexOf("//id.loc.gov/") > 0 + ) { + // If agentUri is not empty, if it is not a blank node, and + // if the URI is an ID uri.... + // Found an agent URI + idInfo = { uri: agentUri.o, validationMessage: "Heading validated" }; + } else if (!_.isEmpty(agentUri)) { + var uriOfRDFSLabel = _.find(displayResource, { + p: "http://www.w3.org/2000/01/rdf-schema#label" + }); + if (!_.isEmpty(uriOfRDFSLabel)) { + // Not crazy about this, but going to hard code LCNAF. + var scheme = "http://id.loc.gov/authorities/names"; + idInfo = bfelabels.findURIatID(scheme, uriOfRDFSLabel.o); + + if (idInfo.validationMessage != "Not found") { + // Let's take what is likely a bnode and replace it in + // the graph with the correct URI. + var replaceBnode = agentUri.o.slice(); + var foundUri = idInfo.uri.slice(); + var as_subjects = _.where(bfestore.store, { + s: replaceBnode + }); + forEach(function(t) { + t.s = foundUri; + }); + displayResource.o = foundUri; + } + } + } + } else if ( property.propertyURI == "http://id.loc.gov/ontologies/bibframe/genreForm" ) { + var uriOfRDFSLabel = _.find(displayResource, { + p: "http://www.w3.org/2000/01/rdf-schema#label" + }); + if ( + !_.isEmpty(uriOfRDFSLabel) && + !uriOfRDFSLabel.s.startsWith("_:b") && + uriOfRDFSLabel.s.indexOf("//id.loc.gov/") > 0 + ) { + idInfo = { uri: uriOfRDFSLabel.s, validationMessage: "Heading validated" }; + } else { + idInfo = { uri: "", validationMessage: "Not found" }; + } + } else if ( property.propertyURI == "http://id.loc.gov/ontologies/bibframe/subject" ) { + var uriOfRDFSLabel = _.find(displayResource, { + p: "http://www.w3.org/2000/01/rdf-schema#label" + }); + if ( + !_.isEmpty(uriOfRDFSLabel) && + !uriOfRDFSLabel.s.startsWith("_:b") && + uriOfRDFSLabel.s.indexOf("//id.loc.gov/") > 0 + ) { + idInfo = { uri: uriOfRDFSLabel.s, validationMessage: "Heading validated" }; + } else if (!_.isEmpty(uriOfRDFSLabel)) { + var scheme_t = _.find(displayResource, { + p: "http://www.loc.gov/mads/rdf/v1#isMemberOfMADSScheme" + }); + if (!_.isEmpty(scheme_t)) { + var scheme = scheme_t.o; + idInfo = bfelabels.findURIatID(scheme, uriOfRDFSLabel.o); + // If we have a match here, then it will be "Heading validated," + // which is correct. + if (idInfo.validationMessage != "Not found") { + // Let's take what is likely a bnode and replace it in + // the graph with the correct URI. + var replaceBnode = displayResource[0].s.slice(); + var foundUri = idInfo.uri.slice(); + var as_subjects = _.where(bfestore.store, { + s: replaceBnode + }); + as_subjects.forEach(function(t) { + t.s = foundUri; + }); + var as_objects = _.where(bfestore.store, { + o: replaceBnode + }); + as_objects.forEach(function(t) { + t.o = foundUri; + }); + } else { + // We didn't find anything in the above step, so let's see + // if we can match the first component. + var componentOne = _.find(displayResource, { + p: "http://www.loc.gov/mads/rdf/v1#componentList" + }); + bfelog.addMsg(new Error(), 'DEBUG', 'componentOne is: ', componentOne); + if ( + !_.isEmpty(componentOne) && + !componentOne.o.startsWith("_:b") + ) { + idInfo = { uri: componentOne.o, validationMessage: "Partial heading validation" }; + } else if (!_.isEmpty(componentOne)) { + var uriOfAuthLabel = _.find(bfestore.store, { + s: componentOne.o, + p: "http://www.loc.gov/mads/rdf/v1#authoritativeLabel" + }); + idInfo = bfelabels.findURIatID(scheme, uriOfAuthLabel.o); + if (idInfo.validationMessage != "Not found") { + // IF we found something, we need to set the + // message to partial validation. + idInfo.validationMessage = "Partial heading validation" + + // Let's take what is likely a bnode and replace it in + // the graph with the correct URI. + var replaceBnode = componentOne.o.slice(); + var foundUri = idInfo.uri.slice(); + var as_subjects = _.where(bfestore.store, { + s: replaceBnode + }); + as_subjects.forEach(function(t) { + t.s = foundUri; + }); + var as_objects = _.where(bfestore.store, { + o: replaceBnode + }); + as_objects.forEach(function(t) { + t.o = foundUri; + }); + } + } + } + } + } + } + bfelog.addMsg(new Error(), 'DEBUG', 'idInfo is: ', idInfo); + if (displaydata === undefined) { if (data !== undefined && data.o !== undefined) { displaydata = data.o; @@ -3166,6 +3308,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' } triples.push(pd); + bfelog.addMsg(new Error(), 'DEBUG', 'triples before button creation are: ', triples); if (hasTemplate) { if (!_.has(property.valueConstraint, "editable")) { @@ -3205,6 +3348,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' 'tguid': pd.guid, 'tlabelhover': displaydata, 'tlabel': displaydata, + 'idInfo': idInfo, 'fobjectid': fobject.id, 'inputid': property.guid, 'editable': property.valueConstraint.editable, @@ -4239,6 +4383,31 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' bfe.saveNoExit(); }); $buttongroup.append($delbutton); + + //if (bgvars.turi !== undefined && bgvars.turi.match('^!_:b')) { + if (bgvars.idInfo !== undefined && bgvars.idInfo.uri !== undefined) { + var bClass = "btn btn-success"; + var sClass = "fa fa-check"; + var sClassStyle = 'style="color:white"'; + if (bgvars.idInfo.validationMessage == "Partial heading validation") { + bClass = "btn btn-outline-success"; + } else if (bgvars.idInfo.validationMessage == "See reference") { + bClass = "btn btn-outline-warning"; + var sClass = "fa fa-close"; + } else if (bgvars.idInfo.validationMessage == "Not found") { + bClass = "btn btn-outline-danger"; + var sClass = "fa fa-close"; + } + $uributton = $(''); + if (bgvars.idInfo.validationMessage != "Not found") { + $urilink = $(''); + } else { + $urilink = $(''); + } + $urilink.append($uributton); + $buttongroup.append($urilink); + + } return $buttongroup; } diff --git a/src/bfelabels.js b/src/bfelabels.js index 9f380e7..f46354b 100644 --- a/src/bfelabels.js +++ b/src/bfelabels.js @@ -104,5 +104,42 @@ bfe.define('src/bfelabels', ['require', 'exports','src/bfelogging' ], function(r } }); } + + exports.findURIatID = function(scheme, label) { + var idInfo = { uri: "", validationMessage: "Not found", label: label }; + var labelservice = scheme + "/label/" + encodeURIComponent(label); + labelservice = labelservice.replace(/^(http:)/,"https:"); + labelservice = labelservice.replace('//id.loc.gov/','//preprod-8288.id.loc.gov/'); + bfelog.addMsg(new Error(), 'DEBUG', 'labelservice uri: ' + labelservice); + + /* + The browser will automatically follow 302, 303 redirects. It is impossible + therefore to perform a HEAD request, get the initial response, pluck the + X-URI out of it, and move one with our lives. We must wait for all the + redirects to play out and the content delivered. + */ + $.ajax({ + type: 'GET', + async: false, + headers: { 'Accept': 'application/json' }, + url: labelservice + }) + .done(function(d, s, xhr) { + uri = xhr.getResponseHeader('x-uri'); + preflabel = xhr.getResponseHeader('x-preflabel'); + idInfo = { uri: uri, label: preflabel }; + prelabel_normalized = preflabel.replace('.', '').replace(' ', ''); + label_normalized = label.replace('.', '').replace(' ', ''); + if (prelabel_normalized != label_normalized) { + idInfo.validationMessage = "See reference"; + } else { + idInfo.validationMessage = "Heading validated"; + } + }) + .fail(function (XMLHttpRequest, textStatus, errorThrown) { + bfelog.addMsg(new Error(), 'ERROR', 'Request status: ' + textStatus + '; Error msg: ' + errorThrown); + }); + return idInfo; + }; }); \ No newline at end of file From 093a364b8bc2ad78135fe1d121646ec67623b933 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Mon, 7 Jun 2021 15:17:54 -0400 Subject: [PATCH 28/32] Add validation for Names and Subjects. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3bb0d27..b21ecef 100755 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "editor", "rdf" ], - "version": "2.0.1", + "version": "2.0.2", "engines": { "node": ">=10.0.0" }, From f6316283142b20a9d120bc0f479ae57d9c7565c1 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Mon, 7 Jun 2021 16:54:54 -0400 Subject: [PATCH 29/32] Spaghetti code to deal with source/Source/code combination and components for TGM. Ripe for refatoring. --- src/bfe.js | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 117 insertions(+), 3 deletions(-) diff --git a/src/bfe.js b/src/bfe.js index 2d3a37b..f8f7b30 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -3188,7 +3188,98 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' ) { idInfo = { uri: uriOfRDFSLabel.s, validationMessage: "Heading validated" }; } else { - idInfo = { uri: "", validationMessage: "Not found" }; + var scheme_t = _.find(displayResource, { + p: "http://www.loc.gov/mads/rdf/v1#isMemberOfMADSScheme" + }); + var scheme = ""; + if (_.isEmpty(scheme_t)) { + // scheme_t is empty; let's see if there's a source property. + var source_t = _.find(displayResource, { + p: "http://id.loc.gov/ontologies/bibframe/source" + }); + if (!_.isEmpty(source_t)) { + var source_code = _.find(bfestore.store, { + s: source_t.o, + p: "http://id.loc.gov/ontologies/bibframe/code" + }); + if (!_.isEmpty(source_code)) { + if (source_code.o == "gmgpc" || source_code.o == "lctgm" ) { + scheme = "http://id.loc.gov/vocabulary/graphicMaterials"; + } else if (source_code.o == "lcgft" ) { + scheme = "http://id.loc.gov/authorities/genreForms"; + } + } + } + } else { + scheme = scheme_t.o; + } + if (scheme != "") { + var uriOfRDFSLabel = _.find(displayResource, { + p: "http://www.w3.org/2000/01/rdf-schema#label" + }); + idInfo = bfelabels.findURIatID(scheme, uriOfRDFSLabel.o); + // If we have a match here, then it will be "Heading validated," + // which is correct. + if (idInfo.validationMessage != "Not found") { + // Let's take what is likely a bnode and replace it in + // the graph with the correct URI. + var replaceBnode = displayResource[0].s.slice(); + var foundUri = idInfo.uri.slice(); + var as_subjects = _.where(bfestore.store, { + s: replaceBnode + }); + as_subjects.forEach(function(t) { + t.s = foundUri; + }); + var as_objects = _.where(bfestore.store, { + o: replaceBnode + }); + as_objects.forEach(function(t) { + t.o = foundUri; + }); + } else { + // We didn't find anything in the above step, so let's see + // if we can match the first component. + var componentOne = _.find(displayResource, { + p: "http://www.loc.gov/mads/rdf/v1#componentList" + }); + bfelog.addMsg(new Error(), 'DEBUG', 'componentOne is: ', componentOne); + if ( + !_.isEmpty(componentOne) && + !componentOne.o.startsWith("_:b") + ) { + idInfo = { uri: componentOne.o, validationMessage: "Partial heading validation" }; + } else if (!_.isEmpty(componentOne)) { + var uriOfAuthLabel = _.find(bfestore.store, { + s: componentOne.o, + p: "http://www.loc.gov/mads/rdf/v1#authoritativeLabel" + }); + idInfo = bfelabels.findURIatID(scheme, uriOfAuthLabel.o); + if (idInfo.validationMessage != "Not found") { + // IF we found something, we need to set the + // message to partial validation. + idInfo.validationMessage = "Partial heading validation" + + // Let's take what is likely a bnode and replace it in + // the graph with the correct URI. + var replaceBnode = componentOne.o.slice(); + var foundUri = idInfo.uri.slice(); + var as_subjects = _.where(bfestore.store, { + s: replaceBnode + }); + as_subjects.forEach(function(t) { + t.s = foundUri; + }); + var as_objects = _.where(bfestore.store, { + o: replaceBnode + }); + as_objects.forEach(function(t) { + t.o = foundUri; + }); + } + } + } + } } } else if ( property.propertyURI == "http://id.loc.gov/ontologies/bibframe/subject" ) { var uriOfRDFSLabel = _.find(displayResource, { @@ -3204,8 +3295,31 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' var scheme_t = _.find(displayResource, { p: "http://www.loc.gov/mads/rdf/v1#isMemberOfMADSScheme" }); - if (!_.isEmpty(scheme_t)) { - var scheme = scheme_t.o; + var scheme = ""; + if (_.isEmpty(scheme_t)) { + // scheme_t is empty; let's see if there's a source property. + var source_t = _.find(displayResource, { + p: "http://id.loc.gov/ontologies/bibframe/source" + }); + if (!_.isEmpty(source_t)) { + var source_code = _.find(bfestore.store, { + s: source_t.o, + p: "http://id.loc.gov/ontologies/bibframe/code" + }); + if (!_.isEmpty(source_code)) { + if (source_code.o == "gmgpc" || source_code.o == "lctgm" ) { + scheme = "http://id.loc.gov/vocabulary/graphicMaterials"; + } else if (source_code.o == "lcsh" ) { + scheme = "http://id.loc.gov/authorities/subjects"; + } else if (source_code.o == "lcshac" || source_code.o == "lcshj" ) { + scheme = "http://id.loc.gov/authorities/childrensSubjects"; + } + } + } + } else { + scheme = scheme_t.o; + } + if (scheme != "") { idInfo = bfelabels.findURIatID(scheme, uriOfRDFSLabel.o); // If we have a match here, then it will be "Heading validated," // which is correct. From 41ba11add1d2fbbc41558254fba864d048958a18 Mon Sep 17 00:00:00 2001 From: Kevin Ford Date: Tue, 8 Jun 2021 13:53:34 -0400 Subject: [PATCH 30/32] Look for children's headings above others; add lcac code. --- src/bfe.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/bfe.js b/src/bfe.js index f8f7b30..4ab823d 100644 --- a/src/bfe.js +++ b/src/bfe.js @@ -3292,11 +3292,17 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' ) { idInfo = { uri: uriOfRDFSLabel.s, validationMessage: "Heading validated" }; } else if (!_.isEmpty(uriOfRDFSLabel)) { + var childrens = _.find(displayResource, { + p: "http://www.loc.gov/mads/rdf/v1#isMemberOfMADSScheme", + o: "http://id.loc.gov/authorities/childrensSubjects" + }); var scheme_t = _.find(displayResource, { p: "http://www.loc.gov/mads/rdf/v1#isMemberOfMADSScheme" }); var scheme = ""; - if (_.isEmpty(scheme_t)) { + if (!_.isEmpty(childrens)) { + scheme = "http://id.loc.gov/authorities/childrensSubjects"; + } else if (_.isEmpty(scheme_t)) { // scheme_t is empty; let's see if there's a source property. var source_t = _.find(displayResource, { p: "http://id.loc.gov/ontologies/bibframe/source" @@ -3311,7 +3317,7 @@ bfe.define('src/bfe', ['require', 'exports', 'src/bfestore', 'src/bfelogging', ' scheme = "http://id.loc.gov/vocabulary/graphicMaterials"; } else if (source_code.o == "lcsh" ) { scheme = "http://id.loc.gov/authorities/subjects"; - } else if (source_code.o == "lcshac" || source_code.o == "lcshj" ) { + } else if (source_code.o == "lcac" || source_code.o == "lcshac" || source_code.o == "lcshj" ) { scheme = "http://id.loc.gov/authorities/childrensSubjects"; } } From c08b798dc38d257cae68c1df1fe2ad152732fc4c Mon Sep 17 00:00:00 2001 From: Trail Date: Wed, 15 Mar 2023 13:09:04 -0400 Subject: [PATCH 31/32] update readme to point to marva --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b36a3fc..8c88e50 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ [bfe][demo-page] ======================= [![CircleCI](https://circleci.com/gh/lcnetdev/bfe/tree/main.svg?style=svg)](https://circleci.com/gh/lcnetdev/bfe/tree/main) +*** Note: This editor is no longer under development. The Library of Congress is MARVA to edit BIBFRAME resources. `bfe` is a standalone Editor for the Library of Congress's [Bibliographic Framework (BIBFRAME) Initiative][bfi]. It can be used more generically as an editor for RDF data. From d857ebb3864d911108ed888a1a8715257642a3de Mon Sep 17 00:00:00 2001 From: Trail Date: Wed, 15 Mar 2023 13:11:10 -0400 Subject: [PATCH 32/32] update readme to point to marva --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c88e50..c11022c 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [bfe][demo-page] ======================= [![CircleCI](https://circleci.com/gh/lcnetdev/bfe/tree/main.svg?style=svg)](https://circleci.com/gh/lcnetdev/bfe/tree/main) -*** Note: This editor is no longer under development. The Library of Congress is MARVA to edit BIBFRAME resources. +*** Note: This editor is no longer under development. The Library of Congress is using MARVA to edit BIBFRAME resources. *** `bfe` is a standalone Editor for the Library of Congress's [Bibliographic Framework (BIBFRAME) Initiative][bfi]. It can be used more generically as an editor for RDF data.