/*! * UI development toolkit for HTML5 (OpenUI5) * (c) Copyright 2009-2018 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ sap.ui.define(["sap/base/assert"], function(assert) { "use strict"; /** * Pattern to analyze MessageFormat strings. * * Group 1: captures doubled single quotes within the string * Group 2: captures quoted fragments within the string. * Note that java.util.MessageFormat silently forgives a missing single quote at * the end of a pattern. This special case is handled by the RegEx as well. * Group 3: captures placeholders * Checks only for numerical argument index, any remainder is ignored up to the next * closing curly brace. Nested placeholders are not accepted! * Group 4: captures any remaining curly braces and indicates syntax errors * * [-1] [----- quoted string -----] [------ placeholder ------] [--] * @private */ var rMessageFormat = /('')|'([^']+(?:''[^']*)*)(?:'|$)|\{([0-9]+(?:\s*,[^{}]*)?)\}|[{}]/g; /** * Creates a string from a pattern by replacing placeholders with concrete values. * * The syntax of the pattern is inspired by (but not fully equivalent to) the * java.util.MessageFormat. * * Placeholders have the form { integer }, where any occurrence of * {0} is replaced by the value with index 0 in aValues, * {1} by the value with index 1 in aValues etc. * * To avoid interpretation of curly braces as placeholders, any non-placeholder fragment * of the pattern can be enclosed in single quotes. The surrounding single quotes will be * omitted from the result. Single quotes that are not meant to escape a fragment and * that should appear in the result, need to be doubled. In the result, only a single * single quote will occur. * * Example: Pattern Strings *
	 *  formatMessage("Say {0}",     ["Hello"]) -> "Say Hello"    // normal use case
	 *  formatMessage("Say '{0}'",   ["Hello"]) -> "Say {0}"      // escaped placeholder
	 *  formatMessage("Say ''{0}''", ["Hello"]) -> "Say 'Hello'"  // doubled single quote
	 *  formatMessage("Say '{0}'''", ["Hello"]) -> "Say {0}'"     // doubled single quote in quoted fragment
	 * 
* In contrast to java.util.MessageFormat, format types or format styles are not supported. * Everything after the argument index and up to the first closing curly brace is ignored. * Nested placeholders (as supported by java.lang.MessageFormat for the format type choice) * are not ignored but reported as a parse error. * * This method throws an Error when the pattern syntax is not fulfilled (e.g. unbalanced curly * braces, nested placeholders or a non-numerical argument index). * * This method can also be used as a formatter within a binding. The first part of a composite binding * will be used as pattern, the following parts as aValues. If there is only one value and this * value is an array it will be handled like the default described above. * * @function * @since 1.58 * @alias module:sap/base/strings/formatMessage * @param {string} sPattern A pattern string in the described syntax * @param {any[]} [aValues=[]] The values to be used instead of the placeholders. * @returns {string} The formatted result string * @SecPassthrough {*|return} * @public */ var fnFormatMessage = function(sPattern, aValues) { assert(typeof sPattern === "string" || sPattern instanceof String, "pattern must be string"); if (arguments.length > 2 || (aValues != null && !Array.isArray(aValues))) { aValues = Array.prototype.slice.call(arguments, 1); } aValues = aValues || []; return sPattern.replace(rMessageFormat, function($0, $1, $2, $3, offset) { if ($1) { // a doubled single quote in a normal string fragment // --> emit a single quote return "'"; } else if ($2) { // a quoted sequence of chars, potentially containing doubled single quotes again // --> emit with doubled single quotes replaced by a single quote return $2.replace(/''/g, "'"); } else if ($3) { // a welformed curly brace // --> emit the argument but ignore other parameters return String(aValues[parseInt($3, 10)]); } // e.g. malformed curly braces // --> throw Error throw new Error("formatMessage: pattern syntax error at pos. " + offset); }); }; return fnFormatMessage; });