126 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const minDisplayHeight = 16;
 | |
| const maxDisplayHeight = 24;
 | |
| /**
 | |
| * Check if displayHeight value is valid, returns 0 on failure
 | |
| */
 | |
| function validateDisplayHeight(value) {
 | |
| 	while (value < minDisplayHeight) value *= 2;
 | |
| 	while (value > maxDisplayHeight) value /= 2;
 | |
| 	return value === Math.round(value) && value >= minDisplayHeight && value <= maxDisplayHeight ? value : 0;
 | |
| }
 | |
| /**
 | |
| * Convert data to valid CollectionInfo
 | |
| */
 | |
| function convertIconSetInfo(data, expectedPrefix = "") {
 | |
| 	if (typeof data !== "object" || data === null) return null;
 | |
| 	const source = data;
 | |
| 	const getSourceNestedString = (field, key, defaultValue = "") => {
 | |
| 		if (typeof source[field] !== "object") return defaultValue;
 | |
| 		const obj = source[field];
 | |
| 		return typeof obj[key] === "string" ? obj[key] : defaultValue;
 | |
| 	};
 | |
| 	let name;
 | |
| 	if (typeof source.name === "string") name = source.name;
 | |
| 	else if (typeof source.title === "string") name = source.title;
 | |
| 	else return null;
 | |
| 	if (expectedPrefix !== "" && typeof source.prefix === "string" && source.prefix !== expectedPrefix) return null;
 | |
| 	const info = { name };
 | |
| 	switch (typeof source.total) {
 | |
| 		case "number":
 | |
| 			info.total = source.total;
 | |
| 			break;
 | |
| 		case "string": {
 | |
| 			const num = parseInt(source.total);
 | |
| 			if (num > 0) info.total = num;
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 	if (typeof source.version === "string") info.version = source.version;
 | |
| 	info.author = { name: getSourceNestedString("author", "name", typeof source.author === "string" ? source.author : "") };
 | |
| 	if (typeof source.author === "object") {
 | |
| 		const sourceAuthor = source.author;
 | |
| 		if (typeof sourceAuthor.url === "string") info.author.url = sourceAuthor.url;
 | |
| 	}
 | |
| 	info.license = { title: getSourceNestedString("license", "title", typeof source.license === "string" ? source.license : "") };
 | |
| 	if (typeof source.license === "object") {
 | |
| 		const sourceLicense = source.license;
 | |
| 		if (typeof sourceLicense.spdx === "string") info.license.spdx = sourceLicense.spdx;
 | |
| 		if (typeof sourceLicense.url === "string") info.license.url = sourceLicense.url;
 | |
| 	}
 | |
| 	if (source.samples instanceof Array) {
 | |
| 		const samples = [];
 | |
| 		source.samples.forEach((item) => {
 | |
| 			if (typeof item === "string" && !samples.includes(item)) samples.push(item);
 | |
| 		});
 | |
| 		if (samples.length) info.samples = samples;
 | |
| 	}
 | |
| 	if (typeof source.height === "number" || typeof source.height === "string") {
 | |
| 		const num = parseInt(source.height);
 | |
| 		if (num > 0) info.height = num;
 | |
| 	}
 | |
| 	if (source.height instanceof Array) {
 | |
| 		source.height.forEach((item) => {
 | |
| 			const num = parseInt(item);
 | |
| 			if (num > 0) {
 | |
| 				if (!(info.height instanceof Array)) info.height = [];
 | |
| 				info.height.push(num);
 | |
| 			}
 | |
| 		});
 | |
| 		switch (info.height.length) {
 | |
| 			case 0:
 | |
| 				delete info.height;
 | |
| 				break;
 | |
| 			case 1: info.height = info.height[0];
 | |
| 		}
 | |
| 	}
 | |
| 	if (typeof info.height === "number") {
 | |
| 		const displayHeight = validateDisplayHeight(info.height);
 | |
| 		if (displayHeight && displayHeight !== info.height) info.displayHeight = displayHeight;
 | |
| 	}
 | |
| 	["samplesHeight", "displayHeight"].forEach((prop) => {
 | |
| 		const value = source[prop];
 | |
| 		if (typeof value === "number" || typeof value === "string") {
 | |
| 			const displayHeight = validateDisplayHeight(parseInt(value));
 | |
| 			if (displayHeight) info.displayHeight = displayHeight;
 | |
| 		}
 | |
| 	});
 | |
| 	if (typeof source.category === "string") info.category = source.category;
 | |
| 	if (source.tags instanceof Array) info.tags = source.tags;
 | |
| 	switch (typeof source.palette) {
 | |
| 		case "boolean":
 | |
| 			info.palette = source.palette;
 | |
| 			break;
 | |
| 		case "string":
 | |
| 			switch (source.palette.toLowerCase()) {
 | |
| 				case "colorless":
 | |
| 				case "false":
 | |
| 					info.palette = false;
 | |
| 					break;
 | |
| 				case "colorful":
 | |
| 				case "true": info.palette = true;
 | |
| 			}
 | |
| 			break;
 | |
| 	}
 | |
| 	if (source.hidden === true) info.hidden = true;
 | |
| 	Object.keys(source).forEach((key) => {
 | |
| 		const value = source[key];
 | |
| 		if (typeof value !== "string") return;
 | |
| 		switch (key) {
 | |
| 			case "url":
 | |
| 			case "uri":
 | |
| 				info.author.url = value;
 | |
| 				break;
 | |
| 			case "licenseURL":
 | |
| 			case "licenseURI":
 | |
| 				info.license.url = value;
 | |
| 				break;
 | |
| 			case "licenseID":
 | |
| 			case "licenseSPDX":
 | |
| 				info.license.spdx = value;
 | |
| 				break;
 | |
| 		}
 | |
| 	});
 | |
| 	return info;
 | |
| }
 | |
| 
 | |
| export { convertIconSetInfo }; | 
