/**
* @param html {String} HTML representing a single element
* @return {Element}
*/
function htmlToElement(html) {
let template = document.createElement('template');
html = html.trim(); // Never return a text node of whitespace as the result
template.innerHTML = html;
//firstChild may be a comment so we must use firstElementChild to avoid picking it
return template.content.firstElementChild;
}
/**
* Converts an Android Vector Drawable to a standard SVG by striping off or renaming some elements
*
* @param s {String} String of an Android Vector Drawable
* @returns {String} The same string but in the standard SVG representation
*/
function androidSVGtoNormalSVG(s) {
s = s.replace(/<\?xml version="1\.0" encoding="utf-8"\?>/g, '');
s = s.replace(//g, '');
s = s.replace(/android:(height|width)="(\d+)dp"/g, '');
s = s.replace(/android:viewportHeight="(\d+\.?\d+)"/g, 'height="$1"');
s = s.replace(/android:viewportWidth="(\d+\.?\d+)"/g, 'width="$1"');
s = s.replace(/android:fillColor=/g, 'fill=');
s = s.replace(/android:pathData=/g, 'd=');
//s = s.replace(/android:/g, '');
return s;
}
function addToTable(name, svg) {
let table = document.querySelector("#preview_table > tbody");
let row = htmlToElement("
");
row.appendChild(htmlToElement("" + name + " | "));
let td = htmlToElement(" | ");
td.appendChild(svg);
row.appendChild(td);
table.appendChild(row);
}
function addSingleItemToTable(str) {
let table = document.querySelector("#preview_table > tbody");
table.append(htmlToElement("" + str + " |
"))
}
function getFile(iconName, downloadUrl) {
return new Promise((resolve, reject) => {
let request = new XMLHttpRequest();
request.open('GET', downloadUrl, true);
request.onreadystatechange = function () {
if (request.readyState === 4 && request.status === 200) {
let androidXmlText = request.responseText;
androidXmlText = androidSVGtoNormalSVG(androidXmlText);
resolve([iconName, androidXmlText]);
} else if (request.readyState === 4) {
//Request completed with an error
resolve([iconName, "Error during download"]);
}
};
request.send(null);
});
}
// This function recovers all icons inside the drawable folder via github API
(function getIcons() {
let request = new XMLHttpRequest();
request.open("GET", "https://api.github.com/repos/mozilla-mobile/android-components/contents/components/ui/icons/src/main/res/drawable", true);
//Explicit request of the V3 version of the API
request.setRequestHeader("Accept", "application/vnd.github.v3+json");
request.onreadystatechange = function () {
if (request.readyState === XMLHttpRequest.DONE && request.status === 200) {
let response = JSON.parse(request.response);
if (response.message) {
//Something went wrong
addSingleItemToTable("Error: " + response.message);
return;
}
addSingleItemToTable("Loading");
let promises = [];
for (let i = 0; i < response.length; i++) {
let iconName = response[i]['name'].substr(0, response[i]['name'].length - 4);
promises.push(getFile(iconName, response[i]['download_url']));
}
Promise.all(promises).then((values) => {
document.querySelector("#preview_table > tbody").innerHTML = "";
for (let i = 0; i < values.length; i++) {
let name = values[i][0], svg = values[i][1];
addToTable(name, htmlToElement(svg));
}
});
}
};
request.send(null);
})();