UNPKG

xliff

Version:

xliff2js and js2xliff converter xliff utils

123 lines (106 loc) 3.96 kB
import convert from 'xml-js' import ElementTypes12 from './inline-elements/ElementTypes12.js' import { makeElement, makeText, makeValue } from './xml-js/objectToXml.js' import escape from './util/escape.js' const jsToXliff12Clb = (obj, opt, cb) => { if (!cb && typeof opt === 'function') { cb = opt opt = { indent: ' ' } } opt = opt || { indent: ' ' } const options = { spaces: opt.indent !== undefined ? opt.indent : ' ', xmlLangAttr: !!opt.xmlLangAttr } const rootAttributes = { 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:schemaLocation': 'urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd', xmlns: 'urn:oasis:names:tc:xliff:document:1.2', version: '1.2' } const root = makeElement('xliff', rootAttributes, true) Object.keys(obj.resources).forEach((nsName) => { const bodyChildren = createUnitTags(obj.resources[nsName], obj, options) const b = makeElement('body', null, bodyChildren) const fileAttributes = { original: nsName, datatype: 'plaintext', 'source-language': obj.sourceLanguage } if (obj.targetLanguage != null) { fileAttributes['target-language'] = obj.targetLanguage } const f = makeElement('file', fileAttributes, [b]) root.elements.push(f) }) const xmlJs = { elements: [root] } const xml = convert.js2xml(xmlJs, options) if (cb) cb(null, xml) return xml } function createUnitTags (unitElements, obj, options) { return Object.keys(unitElements).map((key) => { if (unitElements[key].groupUnits) { return createGroupUnitTag(key, unitElements[key], obj, options) } else { return createTransUnitTag(key, unitElements[key], obj, options) } }) } function createGroupUnitTag (key, resource, obj, options) { const additionalAttributes = resource.additionalAttributes != null ? resource.additionalAttributes : {} const groupUnits = createUnitTags(resource.groupUnits, obj, options) return makeElement('group', Object.assign({ id: escape(key) }, additionalAttributes), groupUnits) } function createTransUnitTag (key, resource, obj, options) { const additionalAttributes = resource.additionalAttributes != null ? resource.additionalAttributes : {} const u = makeElement('trans-unit', Object.assign({ id: escape(key) }, additionalAttributes), true) let sourceAttributes = null if (options.xmlLangAttr) { sourceAttributes = { 'xml:lang': obj.sourceLanguage } } if (!resource.source && resource.target) resource.source = '' if (resource.source != null) u.elements.push(makeElement('source', sourceAttributes, makeValue(resource.source, ElementTypes12))) if (resource.target != null) { let targetAttributes = null if (options.xmlLangAttr && obj.targetLanguage) { targetAttributes = { 'xml:lang': obj.targetLanguage } } u.elements.push(makeElement('target', targetAttributes, makeValue(resource.target, ElementTypes12))) } if ('note' in resource) { createNoteObjects(resource.note).forEach(noteObj => { u.elements.push(makeElement('note', null, [noteObj])) }) } return u } function createNoteObjects (note) { const arrNote = [] const baseNote = makeText(note) if (Array.isArray(baseNote.text)) { baseNote.text.forEach(text => { arrNote.push({ type: baseNote.type, text }) }) } else { arrNote.push(baseNote) } return arrNote } const jsToXliff12 = (obj, opt, cb) => { if (!cb && opt === undefined) { return new Promise((resolve, reject) => jsToXliff12Clb(obj, opt, (err, ret) => err ? reject(err) : resolve(ret))) } if (!cb && typeof opt !== 'function') { return new Promise((resolve, reject) => jsToXliff12Clb(obj, opt, (err, ret) => err ? reject(err) : resolve(ret))) } return jsToXliff12Clb(obj, opt, cb) } jsToXliff12.jsToXliff12Clb = jsToXliff12Clb export default jsToXliff12