UNPKG

xliff

Version:

xliff2js and js2xliff converter xliff utils

169 lines (168 loc) 7.28 kB
"use strict"; 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;