xliff
Version:
xliff2js and js2xliff converter xliff utils
169 lines (168 loc) • 7.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = xliffToJs;
var _xmlJs = _interopRequireDefault(require("xml-js"));
var _ElementTypes = _interopRequireDefault(require("./inline-elements/ElementTypes2.js"));
var _xmlToObject = require("./xml-js/xmlToObject.js");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
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 = _xmlJs.default.xml2js(str, {});
} catch (err) {
if (cb) return cb(err);
return err;
}
var xliffRoot = xmlObj.elements.find(function (ele) {
return ele.name === 'xliff';
});
var version = xliffRoot.attributes && xliffRoot.attributes.version;
if (['2.0', '2.1', '2.2'].includes(version)) {
if (version !== '2.0') {
result.xliffVersion = version;
}
var srcLang = xliffRoot.attributes.srcLang;
var trgLang = xliffRoot.attributes.trgLang;
result.sourceLanguage = srcLang;
result.targetLanguage = trgLang;
if (!result.targetLanguage) delete result.targetLanguage;
var files = [];
var headerExtras = [];
(xliffRoot.elements || []).forEach(function (child) {
if (child.type === 'comment') return;
if (child.name === 'file') {
files.push(child);
} else {
headerExtras.push(child);
}
});
if (headerExtras.length) result.headerExtras = headerExtras;
result.resources = files.reduce(function (resources, file) {
var namespace = options.namespace || file.attributes.id;
if (!namespace) namespace = 'default';
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) {
if (!unit.attributes || !unit.attributes.id) return file;
var key = unit.attributes.id;
var additionalAttributes = _objectSpread({}, unit.attributes);
delete additionalAttributes.id;
if (unit.attributes.ref) {
additionalAttributes.ref = unit.attributes.ref;
}
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
});
}
if (unit.elements) {
var known = ['segment', 'notes', 'source', 'target', 'note', 'ignorable'];
var additionalElements = unit.elements.filter(function (e) {
return !known.includes(e.name);
});
if (additionalElements.length) {
file[key].additionalElements = additionalElements;
}
}
return file;
case 'group':
file[key] = {
groupUnits: createUnits(unit, initValues)
};
if (Object.keys(additionalAttributes).length) {
Object.assign(file[key], {
additionalAttributes: additionalAttributes
});
}
return file;
default:
if (!file._additionalElements) file._additionalElements = [];
file._additionalElements.push(unit);
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 = (0, _xmlToObject.extractValue)(element.elements, _ElementTypes.default);
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)));
}
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);
}
module.exports = exports.default;