@xulab-research/vue-anatomogram
Version:
Interactive anatomical diagrams for Vue.js applications - A Vue-compatible rewrite of EBI anatomogram
98 lines (78 loc) • 2.14 kB
JavaScript
import svgsMetadata from './json/svgsMetadata.json';
const unique = (element, index, array) => {
return array.indexOf(element) === index;
};
const isNotBlank = (str) => {
return typeof str === "string" && str.trim() !== "";
};
export default class Assets {
constructor() {
this.metadata = svgsMetadata;
this.initialized = false;
}
async init() {
this.initialized = true;
return this;
}
getMetadata() {
return this.metadata;
}
getSupportedSpecies() {
return supportedSpecies;
}
getAnatomogramViews(species) {
return getAnatomogramViews(species);
}
getDefaultView(species) {
return getDefaultView(species);
}
}
export const supportedSpecies = svgsMetadata
.map(svgMetadata => svgMetadata.species)
.filter(unique);
const multipleViewsSpecies = svgsMetadata
.filter(svgMetadata => svgMetadata.view !== "")
.map(svgMetadata => svgMetadata.species)
.filter(unique);
const anatomogramViews = multipleViewsSpecies.reduce((acc, species) => {
acc[species] = svgsMetadata
.filter(svgMetadata => svgMetadata.species === species)
.map(svgMetadata => svgMetadata.view)
.filter(isNotBlank)
.sort()
.reverse();
return acc;
}, {});
export const getAnatomogramViews = (species) => {
if (supportedSpecies.includes(species)) {
return anatomogramViews[species] || [];
}
return [];
};
export const getDefaultView = (species) => {
if (supportedSpecies.includes(species)) {
return getAnatomogramViews(species)[0] || null;
}
return null;
};
export const resolve = (uri, baseUrl) => {
try {
if (uri.startsWith('http://') || uri.startsWith('https://')) {
return uri;
}
return baseUrl.endsWith('/') ? baseUrl + uri : baseUrl + '/' + uri;
} catch (e) {
return uri;
}
};
export const loadSvg = (species, view) => {
const svgData = svgsMetadata.find(metadata =>
metadata.species === species && metadata.view === view
);
return svgData ? svgData.path : null;
};
export const getSvgElementById = (svgDomNode) => {
return (id) => {
return svgDomNode ? svgDomNode.getElementById(id) : null;
};
};