UNPKG

@ngx-i18nsupport/ngx-i18nsupport-lib

Version:

A Typescript library to work with Angular generated i18n files (xliff, xmb)

1,009 lines 83.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { ParsedMessagePartType } from './parsed-message-part'; import { ParsedMessagePartText } from './parsed-message-part-text'; import { ParsedMessagePartPlaceholder } from './parsed-message-part-placeholder'; import { ParsedMessagePartStartTag } from './parsed-message-part-start-tag'; import { ParsedMessagePartEndTag } from './parsed-message-part-end-tag'; import { DOMUtilities } from './dom-utilities'; import { format, isNullOrUndefined } from 'util'; import { ParsedMessagePartICUMessage } from './parsed-message-part-icu-message'; import { ParsedMessagePartICUMessageRef } from './parsed-message-part-icu-message-ref'; import { ParsedMessagePartEmptyTag } from './parsed-message-part-empty-tag'; /** * Created by martin on 05.05.2017. * A message text read from a translation file. * Can contain placeholders, tags, text. * This class is a representation independent of the concrete format. */ var /** * Created by martin on 05.05.2017. * A message text read from a translation file. * Can contain placeholders, tags, text. * This class is a representation independent of the concrete format. */ ParsedMessage = /** @class */ (function () { function ParsedMessage(parser, sourceMessage) { this._parser = parser; this.sourceMessage = sourceMessage; this._parts = []; } /** * Get the parser (for tests only, not part of API) * @return parser */ /** * Get the parser (for tests only, not part of API) * @return {?} parser */ ParsedMessage.prototype.getParser = /** * Get the parser (for tests only, not part of API) * @return {?} parser */ function () { return this._parser; }; /** * Create a new normalized message as a translation of this one. * @param normalizedString the translation in normalized form. * If the message is an ICUMessage (getICUMessage returns a value), use translateICUMessage instead. * @throws an error if normalized string is not well formed. * Throws an error too, if this is an ICU message. */ /** * Create a new normalized message as a translation of this one. * @throws an error if normalized string is not well formed. * Throws an error too, if this is an ICU message. * @param {?} normalizedString the translation in normalized form. * If the message is an ICUMessage (getICUMessage returns a value), use translateICUMessage instead. * @return {?} */ ParsedMessage.prototype.translate = /** * Create a new normalized message as a translation of this one. * @throws an error if normalized string is not well formed. * Throws an error too, if this is an ICU message. * @param {?} normalizedString the translation in normalized form. * If the message is an ICUMessage (getICUMessage returns a value), use translateICUMessage instead. * @return {?} */ function (normalizedString) { if (isNullOrUndefined(this.getICUMessage())) { return this._parser.parseNormalizedString((/** @type {?} */ (normalizedString)), this); } else { throw new Error(format('cannot translate ICU message with simple string, use translateICUMessage() instead ("%s", "%s")', normalizedString, this.asNativeString())); } }; /** * Create a new normalized icu message as a translation of this one. * @param icuTranslation the translation, this is the translation of the ICU message, * which is not a string, but a collections of the translations of the different categories. * The message must be an ICUMessage (getICUMessage returns a value) * @throws an error if normalized string is not well formed. * Throws an error too, if this is not an ICU message. */ /** * Create a new normalized icu message as a translation of this one. * @throws an error if normalized string is not well formed. * Throws an error too, if this is not an ICU message. * @param {?} icuTranslation the translation, this is the translation of the ICU message, * which is not a string, but a collections of the translations of the different categories. * The message must be an ICUMessage (getICUMessage returns a value) * @return {?} */ ParsedMessage.prototype.translateICUMessage = /** * Create a new normalized icu message as a translation of this one. * @throws an error if normalized string is not well formed. * Throws an error too, if this is not an ICU message. * @param {?} icuTranslation the translation, this is the translation of the ICU message, * which is not a string, but a collections of the translations of the different categories. * The message must be an ICUMessage (getICUMessage returns a value) * @return {?} */ function (icuTranslation) { /** @type {?} */ var icuMessage = this.getICUMessage(); if (isNullOrUndefined(icuMessage)) { throw new Error(format('this is not an ICU message, use translate() instead ("%s", "%s")', icuTranslation, this.asNativeString())); } else { /** @type {?} */ var translatedICUMessage = icuMessage.translate(icuTranslation); return this._parser.parseICUMessage(translatedICUMessage.asNativeString(), this); } }; /** * Create a new normalized message from a native xml string as a translation of this one. * @param nativeString xml string in the format of the underlying file format. * Throws an error if native string is not acceptable. */ /** * Create a new normalized message from a native xml string as a translation of this one. * @param {?} nativeString xml string in the format of the underlying file format. * Throws an error if native string is not acceptable. * @return {?} */ ParsedMessage.prototype.translateNativeString = /** * Create a new normalized message from a native xml string as a translation of this one. * @param {?} nativeString xml string in the format of the underlying file format. * Throws an error if native string is not acceptable. * @return {?} */ function (nativeString) { return this._parser.createNormalizedMessageFromXMLString(nativeString, this); }; /** * normalized message as string. * @param displayFormat optional way to determine the exact syntax. * Allowed formats are defined as constants NORMALIZATION_FORMAT... */ /** * normalized message as string. * @param {?=} displayFormat optional way to determine the exact syntax. * Allowed formats are defined as constants NORMALIZATION_FORMAT... * @return {?} */ ParsedMessage.prototype.asDisplayString = /** * normalized message as string. * @param {?=} displayFormat optional way to determine the exact syntax. * Allowed formats are defined as constants NORMALIZATION_FORMAT... * @return {?} */ function (displayFormat) { return this._parts.map((/** * @param {?} part * @return {?} */ function (part) { return part.asDisplayString(displayFormat); })).join(''); }; /** * Returns the message content as format dependent native string. * Includes all format specific markup like <ph id="INTERPOLATION" ../> .. */ /** * Returns the message content as format dependent native string. * Includes all format specific markup like <ph id="INTERPOLATION" ../> .. * @return {?} */ ParsedMessage.prototype.asNativeString = /** * Returns the message content as format dependent native string. * Includes all format specific markup like <ph id="INTERPOLATION" ../> .. * @return {?} */ function () { if (isNullOrUndefined(this.getICUMessage())) { return DOMUtilities.getXMLContent(this._xmlRepresentation); } else { return this.getICUMessage().asNativeString(); } }; /** * Validate the message. * @return null, if ok, error object otherwise. */ /** * Validate the message. * @return {?} null, if ok, error object otherwise. */ ParsedMessage.prototype.validate = /** * Validate the message. * @return {?} null, if ok, error object otherwise. */ function () { /** @type {?} */ var hasErrors = false; /** @type {?} */ var errors = {}; /** @type {?} */ var e; e = this.checkPlaceholderAdded(); if (!isNullOrUndefined(e)) { errors.placeholderAdded = e; hasErrors = true; } e = this.checkICUMessageRefRemoved(); if (!isNullOrUndefined(e)) { errors.icuMessageRefRemoved = e; hasErrors = true; } e = this.checkICUMessageRefAdded(); if (!isNullOrUndefined(e)) { errors.icuMessageRefAdded = e; hasErrors = true; } return hasErrors ? errors : null; }; /** * Validate the message, check for warnings only. * A warning shows, that the message is acceptable, but misses something. * E.g. if you remove a placeholder or a special tag from the original message, this generates a warning. * @return null, if no warning, warnings as error object otherwise. */ /** * Validate the message, check for warnings only. * A warning shows, that the message is acceptable, but misses something. * E.g. if you remove a placeholder or a special tag from the original message, this generates a warning. * @return {?} null, if no warning, warnings as error object otherwise. */ ParsedMessage.prototype.validateWarnings = /** * Validate the message, check for warnings only. * A warning shows, that the message is acceptable, but misses something. * E.g. if you remove a placeholder or a special tag from the original message, this generates a warning. * @return {?} null, if no warning, warnings as error object otherwise. */ function () { /** @type {?} */ var hasWarnings = false; /** @type {?} */ var warnings = {}; /** @type {?} */ var w; w = this.checkPlaceholderRemoved(); if (!isNullOrUndefined(w)) { warnings.placeholderRemoved = w; hasWarnings = true; } w = this.checkTagRemoved(); if (!isNullOrUndefined(w)) { warnings.tagRemoved = w; hasWarnings = true; } w = this.checkTagAdded(); if (!isNullOrUndefined(w)) { warnings.tagAdded = w; hasWarnings = true; } return hasWarnings ? warnings : null; }; /** * Test wether this message is an ICU message. * @return true, if it is an ICU message. */ /** * Test wether this message is an ICU message. * @return {?} true, if it is an ICU message. */ ParsedMessage.prototype.isICUMessage = /** * Test wether this message is an ICU message. * @return {?} true, if it is an ICU message. */ function () { return this._parts.length === 1 && this._parts[0].type === ParsedMessagePartType.ICU_MESSAGE; }; /** * Test wether this message contains an ICU message reference. * ICU message references are something like <x ID="ICU"../>. * @return true, if there is an ICU message reference in the message. */ /** * Test wether this message contains an ICU message reference. * ICU message references are something like <x ID="ICU"../>. * @return {?} true, if there is an ICU message reference in the message. */ ParsedMessage.prototype.containsICUMessageRef = /** * Test wether this message contains an ICU message reference. * ICU message references are something like <x ID="ICU"../>. * @return {?} true, if there is an ICU message reference in the message. */ function () { return this._parts.findIndex((/** * @param {?} part * @return {?} */ function (part) { return part.type === ParsedMessagePartType.ICU_MESSAGE_REF; })) >= 0; }; /** * If this message is an ICU message, returns its structure. * Otherwise this method returns null. * @return ICUMessage or null. */ /** * If this message is an ICU message, returns its structure. * Otherwise this method returns null. * @return {?} ICUMessage or null. */ ParsedMessage.prototype.getICUMessage = /** * If this message is an ICU message, returns its structure. * Otherwise this method returns null. * @return {?} ICUMessage or null. */ function () { if (this._parts.length === 1 && this._parts[0].type === ParsedMessagePartType.ICU_MESSAGE) { /** @type {?} */ var icuPart = (/** @type {?} */ (this._parts[0])); return icuPart.getICUMessage(); } else { return null; } }; /** * Check for added placeholder. * @return null or message, if fulfilled. */ /** * Check for added placeholder. * @private * @return {?} null or message, if fulfilled. */ ParsedMessage.prototype.checkPlaceholderAdded = /** * Check for added placeholder. * @private * @return {?} null or message, if fulfilled. */ function () { /** @type {?} */ var e = null; /** @type {?} */ var suspiciousIndexes = []; if (this.sourceMessage) { /** @type {?} */ var sourcePlaceholders_1 = this.sourceMessage.allPlaceholders(); /** @type {?} */ var myPlaceholders = this.allPlaceholders(); myPlaceholders.forEach((/** * @param {?} index * @return {?} */ function (index) { if (!sourcePlaceholders_1.has(index)) { suspiciousIndexes.push(index); } })); } if (suspiciousIndexes.length === 1) { e = 'added placeholder ' + suspiciousIndexes[0] + ', which is not in original message'; } else if (suspiciousIndexes.length > 1) { /** @type {?} */ var allSuspiciousIndexes_1 = ''; /** @type {?} */ var first_1 = true; suspiciousIndexes.forEach((/** * @param {?} index * @return {?} */ function (index) { if (!first_1) { allSuspiciousIndexes_1 = allSuspiciousIndexes_1 + ', '; } allSuspiciousIndexes_1 = allSuspiciousIndexes_1 + index; first_1 = false; })); e = 'added placeholders ' + allSuspiciousIndexes_1 + ', which are not in original message'; } return e; }; /** * Check for removed placeholder. * @return null or message, if fulfilled. */ /** * Check for removed placeholder. * @private * @return {?} null or message, if fulfilled. */ ParsedMessage.prototype.checkPlaceholderRemoved = /** * Check for removed placeholder. * @private * @return {?} null or message, if fulfilled. */ function () { /** @type {?} */ var w = null; /** @type {?} */ var suspiciousIndexes = []; if (this.sourceMessage) { /** @type {?} */ var sourcePlaceholders = this.sourceMessage.allPlaceholders(); /** @type {?} */ var myPlaceholders_1 = this.allPlaceholders(); sourcePlaceholders.forEach((/** * @param {?} index * @return {?} */ function (index) { if (!myPlaceholders_1.has(index)) { suspiciousIndexes.push(index); } })); } if (suspiciousIndexes.length === 1) { w = 'removed placeholder ' + suspiciousIndexes[0] + ' from original message'; } else if (suspiciousIndexes.length > 1) { /** @type {?} */ var allSuspiciousIndexes_2 = ''; /** @type {?} */ var first_2 = true; suspiciousIndexes.forEach((/** * @param {?} index * @return {?} */ function (index) { if (!first_2) { allSuspiciousIndexes_2 = allSuspiciousIndexes_2 + ', '; } allSuspiciousIndexes_2 = allSuspiciousIndexes_2 + index; first_2 = false; })); w = 'removed placeholders ' + allSuspiciousIndexes_2 + ' from original message'; } return w; }; /** * Check for added ICU Message Refs. * @return null or message, if fulfilled. */ /** * Check for added ICU Message Refs. * @private * @return {?} null or message, if fulfilled. */ ParsedMessage.prototype.checkICUMessageRefAdded = /** * Check for added ICU Message Refs. * @private * @return {?} null or message, if fulfilled. */ function () { /** @type {?} */ var e = null; /** @type {?} */ var suspiciousIndexes = []; if (this.sourceMessage) { /** @type {?} */ var sourceICURefs_1 = this.sourceMessage.allICUMessageRefs(); /** @type {?} */ var myICURefs = this.allICUMessageRefs(); myICURefs.forEach((/** * @param {?} index * @return {?} */ function (index) { if (!sourceICURefs_1.has(index)) { suspiciousIndexes.push(index); } })); } if (suspiciousIndexes.length === 1) { e = 'added ICU message reference ' + suspiciousIndexes[0] + ', which is not in original message'; } else if (suspiciousIndexes.length > 1) { /** @type {?} */ var allSuspiciousIndexes_3 = ''; /** @type {?} */ var first_3 = true; suspiciousIndexes.forEach((/** * @param {?} index * @return {?} */ function (index) { if (!first_3) { allSuspiciousIndexes_3 = allSuspiciousIndexes_3 + ', '; } allSuspiciousIndexes_3 = allSuspiciousIndexes_3 + index; first_3 = false; })); e = 'added ICU message references ' + allSuspiciousIndexes_3 + ', which are not in original message'; } return e; }; /** * Check for removed ICU Message Refs. * @return null or message, if fulfilled. */ /** * Check for removed ICU Message Refs. * @private * @return {?} null or message, if fulfilled. */ ParsedMessage.prototype.checkICUMessageRefRemoved = /** * Check for removed ICU Message Refs. * @private * @return {?} null or message, if fulfilled. */ function () { /** @type {?} */ var e = null; /** @type {?} */ var suspiciousIndexes = []; if (this.sourceMessage) { /** @type {?} */ var sourceICURefs = this.sourceMessage.allICUMessageRefs(); /** @type {?} */ var myICURefs_1 = this.allICUMessageRefs(); sourceICURefs.forEach((/** * @param {?} index * @return {?} */ function (index) { if (!myICURefs_1.has(index)) { suspiciousIndexes.push(index); } })); } if (suspiciousIndexes.length === 1) { e = 'removed ICU message reference ' + suspiciousIndexes[0] + ' from original message'; } else if (suspiciousIndexes.length > 1) { /** @type {?} */ var allSuspiciousIndexes_4 = ''; /** @type {?} */ var first_4 = true; suspiciousIndexes.forEach((/** * @param {?} index * @return {?} */ function (index) { if (!first_4) { allSuspiciousIndexes_4 = allSuspiciousIndexes_4 + ', '; } allSuspiciousIndexes_4 = allSuspiciousIndexes_4 + index; first_4 = false; })); e = 'removed ICU message references ' + allSuspiciousIndexes_4 + ' from original message'; } return e; }; /** * Get all indexes of placeholders used in the message. */ /** * Get all indexes of placeholders used in the message. * @private * @return {?} */ ParsedMessage.prototype.allPlaceholders = /** * Get all indexes of placeholders used in the message. * @private * @return {?} */ function () { /** @type {?} */ var result = new Set(); this.parts().forEach((/** * @param {?} part * @return {?} */ function (part) { if (part.type === ParsedMessagePartType.PLACEHOLDER) { /** @type {?} */ var index = ((/** @type {?} */ (part))).index(); result.add(index); } })); return result; }; /** * Return the disp-Attribute of placeholder * @param index index of placeholder * @return disp or null */ /** * Return the disp-Attribute of placeholder * @param {?} index index of placeholder * @return {?} disp or null */ ParsedMessage.prototype.getPlaceholderDisp = /** * Return the disp-Attribute of placeholder * @param {?} index index of placeholder * @return {?} disp or null */ function (index) { /** @type {?} */ var placeHolder = null; this.parts().forEach((/** * @param {?} part * @return {?} */ function (part) { if (part.type === ParsedMessagePartType.PLACEHOLDER) { /** @type {?} */ var phPart = (/** @type {?} */ (part)); if (phPart.index() === index) { placeHolder = phPart; } } })); return placeHolder ? placeHolder.disp() : null; }; /** * Get all indexes of ICU message refs used in the message. */ /** * Get all indexes of ICU message refs used in the message. * @private * @return {?} */ ParsedMessage.prototype.allICUMessageRefs = /** * Get all indexes of ICU message refs used in the message. * @private * @return {?} */ function () { /** @type {?} */ var result = new Set(); this.parts().forEach((/** * @param {?} part * @return {?} */ function (part) { if (part.type === ParsedMessagePartType.ICU_MESSAGE_REF) { /** @type {?} */ var index = ((/** @type {?} */ (part))).index(); result.add(index); } })); return result; }; /** * Return the disp-Attribute of icu message ref * @param index of ref * @return disp or null */ /** * Return the disp-Attribute of icu message ref * @param {?} index of ref * @return {?} disp or null */ ParsedMessage.prototype.getICUMessageRefDisp = /** * Return the disp-Attribute of icu message ref * @param {?} index of ref * @return {?} disp or null */ function (index) { /** @type {?} */ var icuMessageRefPart = null; this.parts().forEach((/** * @param {?} part * @return {?} */ function (part) { if (part.type === ParsedMessagePartType.ICU_MESSAGE_REF) { /** @type {?} */ var refPart = (/** @type {?} */ (part)); if (refPart.index() === index) { icuMessageRefPart = refPart; } } })); return icuMessageRefPart ? icuMessageRefPart.disp() : null; }; /** * Check for added tags. * @return null or message, if fulfilled. */ /** * Check for added tags. * @private * @return {?} null or message, if fulfilled. */ ParsedMessage.prototype.checkTagAdded = /** * Check for added tags. * @private * @return {?} null or message, if fulfilled. */ function () { /** @type {?} */ var e = null; /** @type {?} */ var suspiciousTags = []; if (this.sourceMessage) { /** @type {?} */ var sourceTags_1 = this.sourceMessage.allTags(); /** @type {?} */ var myTags = this.allTags(); myTags.forEach((/** * @param {?} tagName * @return {?} */ function (tagName) { if (!sourceTags_1.has(tagName)) { suspiciousTags.push(tagName); } })); } if (suspiciousTags.length === 1) { e = 'added tag <' + suspiciousTags[0] + '>, which is not in original message'; } else if (suspiciousTags.length > 1) { /** @type {?} */ var allSuspiciousTags_1 = ''; /** @type {?} */ var first_5 = true; suspiciousTags.forEach((/** * @param {?} tag * @return {?} */ function (tag) { if (!first_5) { allSuspiciousTags_1 = allSuspiciousTags_1 + ', '; } allSuspiciousTags_1 = allSuspiciousTags_1 + '<' + tag + '>'; first_5 = false; })); e = 'added tags ' + allSuspiciousTags_1 + ', which are not in original message'; } return e; }; /** * Check for removed tags. * @return null or message, if fulfilled. */ /** * Check for removed tags. * @private * @return {?} null or message, if fulfilled. */ ParsedMessage.prototype.checkTagRemoved = /** * Check for removed tags. * @private * @return {?} null or message, if fulfilled. */ function () { /** @type {?} */ var w = null; /** @type {?} */ var suspiciousTags = []; if (this.sourceMessage) { /** @type {?} */ var sourceTags = this.sourceMessage.allTags(); /** @type {?} */ var myTags_1 = this.allTags(); sourceTags.forEach((/** * @param {?} tagName * @return {?} */ function (tagName) { if (!myTags_1.has(tagName)) { suspiciousTags.push(tagName); } })); } if (suspiciousTags.length === 1) { w = 'removed tag <' + suspiciousTags[0] + '> from original message'; } else if (suspiciousTags.length > 1) { /** @type {?} */ var allSuspiciousTags_2 = ''; /** @type {?} */ var first_6 = true; suspiciousTags.forEach((/** * @param {?} tag * @return {?} */ function (tag) { if (!first_6) { allSuspiciousTags_2 = allSuspiciousTags_2 + ', '; } allSuspiciousTags_2 = allSuspiciousTags_2 + '<' + tag + '>'; first_6 = false; })); w = 'removed tags ' + allSuspiciousTags_2 + ' from original message'; } return w; }; /** * Get all tag names used in the message. */ /** * Get all tag names used in the message. * @private * @return {?} */ ParsedMessage.prototype.allTags = /** * Get all tag names used in the message. * @private * @return {?} */ function () { /** @type {?} */ var result = new Set(); this.parts().forEach((/** * @param {?} part * @return {?} */ function (part) { if (part.type === ParsedMessagePartType.START_TAG || part.type === ParsedMessagePartType.EMPTY_TAG) { /** @type {?} */ var tagName = ((/** @type {?} */ (part))).tagName(); result.add(tagName); } })); return result; }; /** * @return {?} */ ParsedMessage.prototype.parts = /** * @return {?} */ function () { return this._parts; }; /** * @param {?} xmlRepresentation * @return {?} */ ParsedMessage.prototype.setXmlRepresentation = /** * @param {?} xmlRepresentation * @return {?} */ function (xmlRepresentation) { this._xmlRepresentation = xmlRepresentation; }; /** * @param {?} text * @return {?} */ ParsedMessage.prototype.addText = /** * @param {?} text * @return {?} */ function (text) { this._parts.push(new ParsedMessagePartText(text)); }; /** * @param {?} index * @param {?} disp * @return {?} */ ParsedMessage.prototype.addPlaceholder = /** * @param {?} index * @param {?} disp * @return {?} */ function (index, disp) { this._parts.push(new ParsedMessagePartPlaceholder(index, disp)); }; /** * @param {?} tagname * @param {?} idcounter * @return {?} */ ParsedMessage.prototype.addStartTag = /** * @param {?} tagname * @param {?} idcounter * @return {?} */ function (tagname, idcounter) { this._parts.push(new ParsedMessagePartStartTag(tagname, idcounter)); }; /** * @param {?} tagname * @return {?} */ ParsedMessage.prototype.addEndTag = /** * @param {?} tagname * @return {?} */ function (tagname) { // check if well formed /** @type {?} */ var openTag = this.calculateOpenTagName(); if (!openTag || openTag !== tagname) { // oops, not well formed throw new Error(format('unexpected close tag %s (currently open is %s, native xml is "%s")', tagname, openTag, this.asNativeString())); } this._parts.push(new ParsedMessagePartEndTag(tagname)); }; /** * @param {?} tagname * @param {?} idcounter * @return {?} */ ParsedMessage.prototype.addEmptyTag = /** * @param {?} tagname * @param {?} idcounter * @return {?} */ function (tagname, idcounter) { this._parts.push(new ParsedMessagePartEmptyTag(tagname, idcounter)); }; /** * @param {?} index * @param {?} disp * @return {?} */ ParsedMessage.prototype.addICUMessageRef = /** * @param {?} index * @param {?} disp * @return {?} */ function (index, disp) { this._parts.push(new ParsedMessagePartICUMessageRef(index, disp)); }; /** * @param {?} text * @return {?} */ ParsedMessage.prototype.addICUMessage = /** * @param {?} text * @return {?} */ function (text) { this._parts.push(new ParsedMessagePartICUMessage(text, this._parser)); }; /** * Determine, wether there is an open tag, that is not closed. * Returns the latest one or null, if there is no open tag. */ /** * Determine, wether there is an open tag, that is not closed. * Returns the latest one or null, if there is no open tag. * @private * @return {?} */ ParsedMessage.prototype.calculateOpenTagName = /** * Determine, wether there is an open tag, that is not closed. * Returns the latest one or null, if there is no open tag. * @private * @return {?} */ function () { var _this = this; /** @type {?} */ var openTags = []; this._parts.forEach((/** * @param {?} part * @return {?} */ function (part) { switch (part.type) { case ParsedMessagePartType.START_TAG: openTags.push(((/** @type {?} */ (part))).tagName()); break; case ParsedMessagePartType.END_TAG: /** @type {?} */ var tagName = ((/** @type {?} */ (part))).tagName(); if (openTags.length === 0 || openTags[openTags.length - 1] !== tagName) { // oops, not well formed /** @type {?} */ var openTag = (openTags.length === 0) ? 'nothing' : openTags[openTags.length - 1]; throw new Error(format('unexpected close tag %s (currently open is %s, native xml is "%s")', tagName, openTag, _this.asNativeString())); } openTags.pop(); } })); return openTags.length === 0 ? null : openTags[openTags.length - 1]; }; return ParsedMessage; }()); /** * Created by martin on 05.05.2017. * A message text read from a translation file. * Can contain placeholders, tags, text. * This class is a representation independent of the concrete format. */ export { ParsedMessage }; if (false) { /** * Parser that created this message (determines the native format). * @type {?} * @private */ ParsedMessage.prototype._parser; /** * The message where this one stems from as translation. * Optional, set only for messages created by calling translate. * @type {?} * @private */ ParsedMessage.prototype.sourceMessage; /** * The parts of the message. * @type {?} * @private */ ParsedMessage.prototype._parts; /** * messages xml representation. * @type {?} * @private */ ParsedMessage.prototype._xmlRepresentation; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VkLW1lc3NhZ2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abmd4LWkxOG5zdXBwb3J0L25neC1pMThuc3VwcG9ydC1saWIvIiwic291cmNlcyI6WyJpbXBsL3BhcnNlZC1tZXNzYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQW9CLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0UsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDL0UsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDMUUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFFdEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sRUFBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFL0MsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDOUUsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFFckYsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7QUFPMUU7Ozs7Ozs7SUF1QkksdUJBQVksTUFBc0IsRUFBRSxhQUE0QjtRQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHOzs7OztJQUNILGlDQUFTOzs7O0lBQVQ7UUFDSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7T0FNRzs7Ozs7Ozs7O0lBQ0gsaUNBQVM7Ozs7Ozs7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