scratch-sb1-converter
Version:
Scratch 1 (.sb) to Scratch 2 (.sb2) conversion library for Scratch 3.0
81 lines (71 loc) • 2.44 kB
JavaScript
import {PNGFile} from '../coders/png-file';
import {WAVFile} from '../coders/wav-file';
import {FieldObject} from '../squeak/field-object';
import {ObjectRenderer} from './object';
const allPropertyDescriptors = prototype => {
if (prototype === null) return {};
return Object.assign(
allPropertyDescriptors(Object.getPrototypeOf(prototype)),
Object.getOwnPropertyDescriptors(prototype)
);
};
class FieldObjectRenderer {
static check (data) {
return data instanceof FieldObject;
}
addOptionalPreview (obj) {
if (obj.decoded) {
let mime;
let tag;
let encoded;
if (obj.extension === 'uncompressed') {
mime = 'image/png';
tag = new Image();
encoded = new Uint8Array(PNGFile.encode(
obj.width,
obj.height,
obj.decoded
));
} else if (obj.extension === 'jpg') {
mime = 'image/jpg';
tag = new Image();
encoded = obj.decoded;
} else if (obj.extension === 'pcm') {
mime = 'audio/wav';
tag = new Audio();
tag.controls = true;
encoded = new Uint8Array(WAVFile.encode(obj.decoded, {
sampleRate: obj.rate && obj.rate.value
}));
}
tag.src = URL.createObjectURL(new Blob([encoded.buffer], {type: mime}));
obj.preview = tag;
}
return obj;
}
render (data, view) {
new ObjectRenderer().render(
Object.assign(() => this.addOptionalPreview(
Object.entries(
allPropertyDescriptors(Object.getPrototypeOf(data))
)
.filter(([, desc]) => desc.get)
.reduce((carry, [key]) => {
Object.defineProperty(carry, key, {
enumerable: true,
get () {
return data[key];
}
});
return carry;
}, {})
), {
toString () {
return data.toString();
}
}),
view
);
}
}
export {FieldObjectRenderer};