matroska-schema
Version:
node-ebml's schema packaged in a format compatible with node-matroska's
108 lines (89 loc) • 3.42 kB
JavaScript
const { readFile } = require('fs');
const { parseString } = require('xml2js');
const { EOL } = require('os');
const { inspect } = require('util');
const byEbmlID = {};
const byName = {};
function parse(fname, cb) {
readFile(fname, (err, data) => {
if (err) {
return cb(err);
}
parseString(data, (err, spec) => {
if (err) {
return cb(erR);
}
for (el of spec.EBMLSchema.element) {
const id = parseInt(el.$.id);
const name = el.$.name;
const docs = new Map((el.documentation || []).map(d => [d.$.purpose, d]));
const exts = new Map((el.extension || []).map(e => [e.$.type, e]));
const info = {
name,
level: el.$.path && el.$.path.replace(/\\[()]/g, '').split('\\').length - 2,
type: el.$.type && (el.$.type === 'utf-8' ? '8' : el.$.type.substring(0, 1)),
multiple: el.$.maxOccurs !== '1',
webm: exts.get('webmproject.org') ? exts.get('webmproject.org').$.webm === '1' : undefined,
description: docs.get('definition') ? docs.get('definition')._.replace(/\n */g, ' ') : undefined,
mandatory: el.$.minOccurs && el.$.minOccurs !== '0',
range: el.$.range,
cppname: exts.get('libmatroska') ? exts.get('libmatroska').$.cppname : undefined,
minver: el.$.minver ? parseInt(el.$.minver) : 1,
maxver: el.$.maxver && parseInt(el.$.maxver),
default: el.$.default,
divx: exts.get('divx.com') ? exts.get('divx.com').$.divx === '1' : undefined,
crc: name == 'CRC-32',
i: el.$.i
}
byEbmlID[id] = byEbmlID[id] || {};
for (let p in info) {
if (info[p] !== undefined) {
byEbmlID[id][p] = info[p];
}
}
byName[name.replace(/-/g, '_')] = id;
}
cb();
});
});
}
parse('ebml_matroska.xml', err => {
if (err) {
throw err;
}
parse('ebml.xml', err => {
if (err) {
throw err;
}
parse('overrides.xml', err => {
if (err) {
throw err;
}
function writeln(s) {
process.stdout.write(s);
process.stdout.write(EOL);
}
function indent(s, n) {
return s.split(EOL).join(EOL + ' '.repeat(n));
}
writeln('module.exports = {');
writeln(' byEbmlID: {');
for (let k in byEbmlID) {
process.stdout.write(` 0x${parseInt(k).toString(16)}: `);
process.stdout.write(indent(inspect(byEbmlID[k], {
depth: null,
maxArrayLength: null,
maxStringLength: null
}), 4));
writeln(',');
}
writeln(' },');
writeln(' byName: {');
for (let k in byName) {
writeln(` ${k}: 0x${byName[k].toString(16)},`);
}
writeln(' }');
writeln('};');
});
});
});