diff --git a/Notes.md b/Notes.md index ad10a68..8d1b9f1 100644 --- a/Notes.md +++ b/Notes.md @@ -1,2 +1,61 @@ # My notes... +colours20 = { + "dimgray": "#696969", + "seagreen": "#2e8b57", + "darkred": "#8b0000", + "olive": "#808000", + "darkblue": "#00008b", + "maroon3": "#b03060", + "orangered": "#ff4500", + "orange": "#ffa500", + "lime": "#00ff00", + "mediumorchid": "#ba55d3", + "darksalmon": "#e9967a", + "aqua": "#00ffff", + "blue": "#0000ff", + "fuchsia": "#ff00ff", + "dodgerblue": "#1e90ff", + "palegoldenrod": "#eee8aa", + "laserlemon": "#ffff54", + "plum": "#dda0dd", + "palegreen": "#98fb98", + "lightskyblue": "#87cefa" +} +const colours20 = [ "#696969", "#2e8b57", "#8b0000", "#808000", "#00008b", "#b03060", "#ff4500", "#ffa500", "#00ff00", "#ba55d3", "#e9967a", "#00ffff", "#0000ff", "#ff00ff", "#1e90ff", "#eee8aa", "#ffff54", "#dda0dd", "#98fb98", "#87cefa" ]; + + +colours30 = { + "gray": "#808080", + "maroon2": "#7f0000", + "darkgreen": "#006400", + "olive": "#808000", + "darkslateblue": "#483d8b", + "darkcyan": "#008b8b", + "peru": "#cd853f", + "darkblue": "#00008b", + "purple2": "#7f007f", + "darkseagreen": "#8fbc8f", + "maroon3": "#b03060", + "red": "#ff0000", + "darkorange": "#ff8c00", + "lime": "#00ff00", + "darkviolet": "#9400d3", + "springgreen": "#00ff7f", + "crimson": "#dc143c", + "aqua": "#00ffff", + "deepskyblue": "#00bfff", + "blue": "#0000ff", + "lightcoral": "#f08080", + "greenyellow": "#adff2f", + "dodgerblue": "#1e90ff", + "laserlemon": "#ffff54", + "lightgreen": "#90ee90", + "lightblue": "#add8e6", + "deeppink": "#ff1493", + "mediumslateblue": "#7b68ee", + "violet": "#ee82ee", + "moccasin": "#ffe4b5" +} + +const colours30 = [ "#808080", "#7f0000", "#006400", "#808000", "#483d8b", "#008b8b", "#cd853f", "#00008b", "#7f007f", "#8fbc8f", "#b03060", "#ff0000", "#ff8c00", "#00ff00", "#9400d3", "#00ff7f", "#dc143c", "#00ffff", "#00bfff", "#0000ff", "#f08080", "#adff2f", "#1e90ff", "#ffff54", "#90ee90", "#add8e6", "#ff1493", "#7b68ee", "#ee82ee", "#ffe4b5" ]; diff --git a/package-lock.json b/package-lock.json index 726980c..0582eab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "prettier": "^3.1.1", "prettier-plugin-svelte": "^3.1.2", "svelte": "^4.2.7", + "svelte-popover": "^2.0.8", "vite": "^5.0.3", "vitest": "^2.0.0" } @@ -3111,6 +3112,13 @@ "svelte": "^3.19.0 || ^4.0.0" } }, + "node_modules/svelte-popover": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/svelte-popover/-/svelte-popover-2.0.8.tgz", + "integrity": "sha512-Yvz4FpvvXc5aBGyIE/TlGlqULLKkcfc7N0MoaqNXHMRVXxla+sc7G1xSCCURP3VqP0nZ5cIyPWOLLWFXuJjTRA==", + "dev": true, + "license": "ISC" + }, "node_modules/svelte-preprocess": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-6.0.2.tgz", diff --git a/package.json b/package.json index a8e66a4..7c8dcdc 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "prettier": "^3.1.1", "prettier-plugin-svelte": "^3.1.2", "svelte": "^4.2.7", + "svelte-popover": "^2.0.8", "vite": "^5.0.3", "vitest": "^2.0.0" }, diff --git a/src/routes/+page.js b/src/routes/+page.js index 951d6a5..880a3ea 100644 --- a/src/routes/+page.js +++ b/src/routes/+page.js @@ -7,6 +7,7 @@ export const load = async ({ fetch }) => { return { webservices: { technologies: webservicesData.technologies, + affiliates: webservicesData.affiliates, hosts: webservicesData.hosts } }; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index c3c4f3c..9bcb3c5 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -2,94 +2,129 @@ export let data; const { webservices } = data; + //console.log('orig:', webservices); + //console.log('orig affiliates:', webservices.affiliates); + //console.log('orig hosts:', webservices.hosts); + + // source: https://mokole.com/palette.html 20 colors with default settings otherwise + const colours30 = [ "#808080", "#7f0000", "#006400", "#808000", "#483d8b", "#008b8b", "#cd853f", "#00008b", "#7f007f", "#8fbc8f", "#b03060", "#ff0000", "#ff8c00", "#00ff00", "#9400d3", "#00ff7f", "#dc143c", "#00ffff", "#00bfff", "#0000ff", "#f08080", "#adff2f", "#1e90ff", "#ffff54", "#90ee90", "#add8e6", "#ff1493", "#7b68ee", "#ee82ee", "#ffe4b5" ]; + function processData(webservices) { let instances = 0; - let current = {}; - let current_status = []; - let future = {}; + let current = []; + let future = []; // properties of technologies - let categories = []; - let analogues = []; - let licenses = []; + let category_list = []; + let analogue_list = []; + let license_list = []; // properties of instances - let statuses = []; - let affiliates = []; + let status_list = []; + let affiliate_list = []; + let host_list = []; + // actual objects let hosts = []; + let affiliates = []; // // just a trivial reassignment //let hosts = webservices.hosts; // // pull out relevant info in useful chunks. - webservices.technologies.forEach(function(tech, i) { + for (let key in webservices.technologies) { + let tech = webservices.technologies[key]; if (tech.hasOwnProperty('categories') && tech.categories.constructor === Array ) { tech.categories.forEach(function(category, index) { - if (categories.hasOwnProperty(category)) categories[category]++; - else categories[category] = 1; + if (category_list.hasOwnProperty(category)) category_list[category]++; + else category_list[category] = 1; }); } if (tech.hasOwnProperty('analogues') && tech.analogues.constructor === Array ) { tech.analogues.forEach(function(analogue, index) { - if (analogues.hasOwnProperty(analogue)) analogues[analogue]++; - else analogues[analogue] = 1; + if (analogue_list.hasOwnProperty(analogue)) analogue_list[analogue]++; + else analogue_list[analogue] = 1; }); } if (tech.hasOwnProperty('license')) { let license = tech.license; - if (licenses.hasOwnProperty(license)) licenses[license]++; - else licenses[license] = 1; + if (license_list.hasOwnProperty(license)) license_list[license]++; + else license_list[license] = 1; } if (hasInstances(tech)) { + tech['name'] = key; + current.push(tech); //console.log(tech.name + ': ' + tech.instances.length + ' instances...'); tech.instances.forEach(function(instance, i) { instances++; if (instance.hasOwnProperty('status')) { let tag = instance.status; - if (statuses.hasOwnProperty(tag)) statuses[tag]++; - else statuses[tag] = 1; + if (status_list.hasOwnProperty(tag)) status_list[tag]++; + else status_list[tag] = 1; } if (instance.hasOwnProperty('affiliation')) { let tag = instance.affiliation; - if (affiliates.hasOwnProperty(tag)) affiliates[tag]++; - else affiliates[tag] = 1; + if (affiliate_list.hasOwnProperty(tag)) affiliate_list[tag]++; + else affiliate_list[tag] = 1; } if (instance.hasOwnProperty('host')) { let tag = instance.host; - if (hosts.hasOwnProperty(tag)) hosts[tag]++; - else hosts[tag] = 1; + if (host_list.hasOwnProperty(tag)) host_list[tag]++; + else host_list[tag] = 1; } }); + } else { + future[key] = tech; } - }); - /*console.log('categories: ', categories); - console.log('analogues: ', analogues); - console.log('licenses: ', licenses); - console.log('statuses: ', statuses); - console.log('affiliates: ', affiliates); - console.log('hosts: ', hosts); */ + }; + for (let key in webservices.hosts) { + //console.log('key: ', key); + let host = webservices.hosts[key]; + host['name'] = key; + //console.log('host: ', host); + if (host.hasOwnProperty('domain') && !(host.hasOwnProperty('status') && host.status == 'retired')) { + hosts[key] = host; + } + } + //console.log('webservices.affiliates: ', webservices.affiliates); + for (let key in webservices.affiliates) { + //console.log('key: ', key); + let affiliate = webservices.affiliates[key]; + //console.log('affiliate assignment: ', affiliate); + affiliates[key] = affiliate; + // if (affiliate.hasOwnProperty('name')) { + // affiliate_data[key] = affiliate; + // } + } + //console.log('categories: ', categories); + //console.log('analogues: ', analogues); + //console.log('licenses: ', licenses); + //console.log('statuses: ', statuses); + //console.log('affiliates: ', affiliates); + //console.log('hosts: ', hosts); return { total_instances: instances, active_services: current, candidate_services: future, - tech_tags: { - categories: categories, - analogues: analogues, - licenses: licenses + tech_lists: { + category_list: category_list, + analogue_list: analogue_list, + license_list: license_list }, - instance_tags: { - statuses: statuses, - affiliates: affiliates, - hosts: hosts - } + instance_lists: { + status_list: status_list, + affiliate_list: affiliate_list, + host_list: host_list + }, + hosts: hosts, + affiliates: affiliates }; } // console.log(technologies); function hasInstances(tech) { - if (tech.hasOwnProperty('instances') && tech.instances.constructor === Array) return true; + if (tech.hasOwnProperty('instances') && tech.instances.constructor === Array && tech.instances.length) return true; return false; } @@ -97,35 +132,82 @@ let keys = []; for (let key in ob) { keys.push(key); - //console.log('pushing key ' + key); }; return keys; } - const results = processData(webservices); - // console.log('results: ', results); - /*console.log('stats = ' + results.total_instances); - console.log('tech_tags: ', results.tech_tags); - console.log('instance_tags: ', results.instance_tags);*/ + function toOxfordCommaString(arr) { + if (arr.length == 1) return arr; + else { + var last = arr.pop(); + return arr.join(', ') + ', and ' + last; + } + } - const technologies = webservices.technologies; - //const hosts = webservices.hosts; - /*const categories = results.tech_tags.categories); - const analogues = results.tech_tags.analogues); - const licenses = results.tech_tags.licenses); - const statuses = results.instance_tags.statuses); - const affiliates = results.instance_tags.affiliates); - const hosts = results.instance_tags.hosts);*/ - const categories = getKeys(results.tech_tags.categories); - //const categories = results.tech_tags.categories); - const analogues = getKeys(results.tech_tags.analogues); - const licenses = getKeys(results.tech_tags.licenses); - const statuses = getKeys(results.instance_tags.statuses); - const affiliates = getKeys(results.instance_tags.affiliates); - const hosts = getKeys(results.instance_tags.hosts); + function hostColours(host_list, colours, hosts) { + let host_array = {}; + let i = 0; + + //console.log('hosts:', hosts); + + host_list.forEach(function(host) { + //console.log(host); + if (hosts[host].hasOwnProperty('domain') && hosts[host].hasOwnProperty('affiliation')) { + host_array[host] = { + "colour": colours[i++], + "domain": hosts[host].domain, + "affiliation": hosts[host].affiliation + } + } + }); + return host_array; + } + + function affiliateColours(affiliate_list, colours, affiliates) { + let affiliate_array = {}; + let i = 0; + + //console.log('affiliates:', affiliates); + + for (const affiliate of affiliate_list) { + //console.log('affiliate:', affiliate); + if (affiliates[affiliate].hasOwnProperty('name') && affiliates[affiliate].hasOwnProperty('website')) { + affiliate_array[affiliate] = { + "colour": colours[i++], + "name": affiliates[affiliate].name, + "website": affiliates[affiliate].website + } + } + } + return affiliate_array; + } + + + const results = processData(webservices); + //console.log('results: ', results); + + //const technologies = webservices.technologies; + const technologies = results.active_services; + //console.log(technologies); + + const category_list = getKeys(results.tech_lists.category_list).sort(); + const analogue_list = getKeys(results.tech_lists.analogue_list).sort(); + const license_list = getKeys(results.tech_lists.license_list).sort(); + const status_list = getKeys(results.instance_lists.status_list).sort(); + const affiliate_list = getKeys(results.instance_lists.affiliate_list).sort(); + const host_list = getKeys(results.instance_lists.host_list).sort(); + + const hosts = results.hosts; + //console.log('host_data: ', results.hosts); + const affiliates = results.affiliates; + //console.log('affiliate_data: ', results.affiliates); + const host_colours = hostColours(host_list, colours30, hosts); + //console.log('host_colours:', host_colours); + const affiliate_colours = affiliateColours(affiliate_list, colours30, affiliates); + //console.log('affiliate_colours:',affiliate_colours); //console.log('categories array: ', results.tech_tags.categories); - console.log('categories keys: ', categories); + //console.log('categories keys: ', categories); @@ -139,48 +221,29 @@
-
- {#each categories as category} - {category} - {/each} -
+
Categories: {#each category_list as category}{category} {/each}
+ +
Licenses: {#each license_list as license}{license} {/each}
-
- {#each statuses as status} - {status} - {/each} -
-
- {#each affiliates as affiliate} - {affiliate} - {/each} -
-
- {#each hosts as host} - {host} - {/each} -
+
Statuses: {#each status_list as status}{status} {/each}
Affiliates: {#each affiliate_list as affiliate} {affiliate} {/each}
+
Hosts: {#each host_list as host} {host} {/each}
{#each technologies as technology}

{technology.name}

- + {#if (technology.license)}

License: {technology.license}

{/if} + {#if (technology.analogues)}

Alternative to {toOxfordCommaString(technology.analogues)}

{/if} +

{technology.description}

{#if hasInstances(technology)} -
-
    - {#each technology.instances as instance} -
  • {instance.domain} {instance.affiliation}
  • - {/each} -
+

{#each technology.instances as instance} + {/each}

{:else} -
-
    -
  • Nothing here yet...
  • -
+
+ Nothing here yet...
{/if}
@@ -191,39 +254,128 @@