stab-crashes/rerank.js

149 строки
4.1 KiB
JavaScript

let options = {
'product': {
value: null,
type: 'option',
},
'channel': {
value: null,
type: 'option',
},
'signature': {
value: null,
type: 'button',
}
};
function getOption(name) {
return options[name].value;
}
function getOptionType(name) {
return options[name].type;
}
function setOption(name, value) {
return options[name].value = value;
}
let onLoad = new Promise(function(resolve, reject) {
window.onload = resolve;
});
function getCorrelations() {
if (!getOption('channel') || !getOption('signature')) {
return;
}
let url = new URL(location.href);
url.search = '?product=' + getOption('product') + '&channel=' + getOption('channel') + '&signature=' + getOption('signature');
history.replaceState({}, document.title, url.href);
let signature = decodeURIComponent(getOption('signature'));
let channel = getOption('channel');
let product = getOption('product');
document.getElementById('channel_from').textContent = channel;
let table = document.getElementById('rerank_table');
while (table.rows.length > 1) {
table.deleteRow(table.rows.length - 1);
}
let preElem = document.getElementById('rerank_text');
correlations.rerank(preElem, signature, channel, 'release', product)
.then(entries => entries.forEach(entry => {
let row = table.insertRow(table.rows.length);
let property = row.insertCell(0);
property.appendChild(document.createTextNode(entry.property));
let in_signature = row.insertCell(1);
in_signature.appendChild(document.createTextNode(entry.in_signature + ' %'));
let in_channel = row.insertCell(2);
in_channel.appendChild(document.createTextNode(correlations.toPercentage(entry.in_channel) + ' %'));
let in_channel_target = row.insertCell(3);
in_channel_target.appendChild(document.createTextNode(correlations.toPercentage(entry.in_channel_target) + ' %'));
let channel_multiplier = entry.in_channel_target / entry.in_channel;
let channel_multiplier_cell = row.insertCell(4);
let channel_multiplier_span = document.createElement('span');
channel_multiplier_span.textContent = channel_multiplier.toFixed(2) + 'x';
if (channel_multiplier < 1) {
channel_multiplier_span.style.color = 'green';
} else {
channel_multiplier_span.style.color = 'red';
}
channel_multiplier_cell.appendChild(channel_multiplier_span);
}));
}
onLoad
.then(function() {
let queryVars = new URL(location.href).search.substring(1).split('&');
Object.keys(options)
.forEach(function(optionName) {
let optionType = getOptionType(optionName);
let elem = document.getElementById(optionName);
for (let queryVar of queryVars) {
if (queryVar.startsWith(optionName + '=')) {
let option = queryVar.substring((optionName + '=').length).trim();
setOption(optionName, option);
}
}
if (optionType === 'select') {
if (getOption(optionName)) {
elem.checked = getOption(optionName);
}
setOption(optionName, elem.checked);
elem.onchange = function() {
setOption(optionName, elem.checked);
getCorrelations();
};
} else if (optionType === 'option') {
if (getOption(optionName)) {
for (let i = 0; i < elem.options.length; i++) {
if (elem.options[i].value === getOption(optionName)) {
elem.selectedIndex = i;
break;
}
}
}
setOption(optionName, elem.options[elem.selectedIndex].value);
elem.onchange = function() {
setOption(optionName, elem.options[elem.selectedIndex].value);
getCorrelations();
};
} else if (optionType === 'button') {
if (getOption(optionName)) {
elem.value = getOption(optionName);
}
setOption(optionName, elem.value.trim());
document.getElementById(optionName + 'Button').onclick = function() {
setOption(optionName, elem.value.trim());
getCorrelations();
};
} else {
throw new Error('Unexpected option type.');
}
});
})
.then(function() {
getCorrelations();
})
.catch(function(err) {
console.error(err);
});