A complete rewrite of OpcodeLabels. Instead of function, it’s a class that maintains a current translator function, and updates the opcode labelFn for each opcode when a new translator function is set. Add function `getLabel` to return the object with `category` and `labelFn` based on the opcode. Set intl.formatMessage as the translator function in MonitorList. It has access to the intl object, and wraps all monitors.
47 lines
1.8 KiB
JavaScript
47 lines
1.8 KiB
JavaScript
import OpcodeLabels from './opcode-labels.js';
|
|
|
|
const isUndefined = a => typeof a === 'undefined';
|
|
|
|
/**
|
|
* Convert monitors from VM format to what the GUI needs to render.
|
|
* - Convert opcode to a label and a category
|
|
* @param {string} block.id - The id of the monitor block
|
|
* @param {string} block.spriteName - Present only if the monitor applies only to the sprite
|
|
* with given target ID. The name of the target sprite when the monitor was created
|
|
* @param {string} block.opcode - The opcode of the monitor
|
|
* @param {object} block.params - Extra params to the monitor block
|
|
* @param {string|number|Array} block.value - The monitor value
|
|
* @param {VirtualMachine} block.vm - the VM instance which owns the block
|
|
* @return {object} The adapted monitor with label and category
|
|
*/
|
|
export default function ({id, spriteName, opcode, params, value, vm}) {
|
|
// Extension monitors get their labels from the Runtime through `getLabelForOpcode`.
|
|
// Other monitors' labels are hard-coded in `OpcodeLabels`.
|
|
let {label, category, labelFn} = (vm && vm.runtime.getLabelForOpcode(opcode)) || OpcodeLabels.getLabel(opcode);
|
|
|
|
// Use labelFn if provided for dynamic labelling (e.g. variables)
|
|
if (!isUndefined(labelFn)) label = labelFn(params);
|
|
|
|
// Append sprite name for sprite-specific monitors
|
|
if (spriteName) {
|
|
label = `${spriteName}: ${label}`;
|
|
}
|
|
|
|
// If value is a number, round it to six decimal places
|
|
if (typeof value === 'number') {
|
|
value = Number(value.toFixed(6));
|
|
}
|
|
|
|
// Turn the value to a string, for handle boolean values
|
|
if (typeof value === 'boolean') {
|
|
value = value.toString();
|
|
}
|
|
|
|
// Lists can contain booleans, which should also be turned to strings
|
|
if (Array.isArray(value)) {
|
|
value = value.map(item => item.toString());
|
|
}
|
|
|
|
return {id, label, category, value};
|
|
}
|