xliff
Version:
xliff2js and js2xliff converter xliff utils
127 lines • 4.28 kB
JavaScript
import convert from 'xml-js';
import ElementTypes2 from './inline-elements/ElementTypes2.js';
import { extractValue } from './xml-js/xmlToObject.js';
var xliffToJsClb = function xliffToJsClb(str, options, cb) {
if (typeof options === 'function') {
cb = options;
options = {};
}
options = options || {};
if (typeof str !== 'string') {
var err = new Error('The first parameter was not a string');
if (cb) return cb(err);
return err;
}
var result = {};
var xmlObj;
try {
xmlObj = convert.xml2js(str, {});
} catch (err) {
if (cb) return cb(err);
return err;
}
var xliffRoot = xmlObj.elements.find(function (ele) {
return ele.name === 'xliff';
});
if (xliffRoot.attributes) {
var srcLang = xliffRoot.attributes.srcLang;
var trgLang = xliffRoot.attributes.trgLang;
result.sourceLanguage = srcLang;
result.targetLanguage = trgLang;
if (!result.targetLanguage) delete result.targetLanguage;
xliffRoot.elements = xliffRoot.elements.filter(function (child) {
return child.type !== 'comment';
});
result.resources = xliffRoot.elements.reduce(function (resources, file) {
var namespace = options.namespace || file.attributes.id;
var initValues = {};
if (!result.targetLanguage) delete initValues.target;
file.elements = file.elements || [];
file.elements = file.elements.filter(function (child) {
return child.type !== 'comment';
});
resources[namespace] = createUnits(file, initValues);
return resources;
}, {});
}
if (cb) return cb(null, result);
return result;
};
function createUnits(parent, initValues) {
if (!parent.elements) return {};
return parent.elements.reduce(function (file, unit) {
var key = unit.attributes.id;
var additionalAttributes = unit.attributes;
delete additionalAttributes.id;
if (additionalAttributes['slr:sizeRestriction'] !== undefined) {
additionalAttributes.sizeRestriction = additionalAttributes['slr:sizeRestriction'];
if (typeof additionalAttributes.sizeRestriction === 'string') additionalAttributes.sizeRestriction = parseInt(additionalAttributes.sizeRestriction);
delete additionalAttributes['slr:sizeRestriction'];
}
switch (unit.name) {
case 'unit':
file[key] = createUnit(unit, initValues);
if (Object.keys(additionalAttributes).length) {
Object.assign(file[key], {
additionalAttributes: additionalAttributes
});
}
return file;
case 'group':
file[key] = {
groupUnits: createUnits(unit, initValues)
};
if (Object.keys(additionalAttributes).length) {
Object.assign(file[key], {
additionalAttributes: additionalAttributes
});
}
return file;
default:
return file;
}
}, {});
}
function createUnit(unit, initValues) {
if (!unit.elements) return undefined;
return unit.elements.reduce(function (unit, segment) {
if (['segment', 'notes'].indexOf(segment.name) < 0) return unit;
segment.elements.forEach(function (element) {
var value = extractValue(element.elements, ElementTypes2);
switch (element.name) {
case 'source':
case 'target':
unit[element.name] = value;
break;
case 'note':
if (unit[element.name]) {
if (!Array.isArray(unit[element.name])) {
unit[element.name] = [unit[element.name]];
}
unit[element.name].push(value);
} else {
unit[element.name] = value;
}
break;
}
});
return unit;
}, JSON.parse(JSON.stringify(initValues)));
}
export default function xliffToJs(str, options, cb) {
if (!cb && options === undefined) {
return new Promise(function (resolve, reject) {
return xliffToJsClb(str, options, function (err, ret) {
return err ? reject(err) : resolve(ret);
});
});
}
if (!cb && typeof options !== 'function') {
return new Promise(function (resolve, reject) {
return xliffToJsClb(str, options, function (err, ret) {
return err ? reject(err) : resolve(ret);
});
});
}
xliffToJsClb(str, options, cb);
}