@ngx-i18nsupport/ngx-i18nsupport-lib
Version:
A Typescript library to work with Angular generated i18n files (xliff, xmb)
1,009 lines • 83.1 kB
JavaScript
/**
* @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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