/** * @license Apache-2.0 * * Copyright (c) 2022 The Stdlib Authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 'use strict'; // VARIABLES // var RE = /%(?:([1-9]\d*)\$)?([0 +\-#]*)(\*|\d+)?(?:(\.)(\*|\d+)?)?[hlL]?([%A-Za-z])/g; // FUNCTIONS // /** * Parses a delimiter. * * @private * @param {Array} match - regular expression match * @returns {Object} delimiter token object */ function parse( match ) { var token = { 'mapping': ( match[ 1 ] ) ? parseInt( match[ 1 ], 10 ) : void 0, 'flags': match[ 2 ], 'width': match[ 3 ], 'precision': match[ 5 ], 'specifier': match[ 6 ] }; if ( match[ 4 ] === '.' && match[ 5 ] === void 0 ) { token.precision = '1'; } return token; } // MAIN // /** * Tokenizes a string into an array of string parts and format identifier objects. * * @param {string} str - input string * @returns {Array} tokens * * @example * var tokens = formatTokenize( 'Hello %s!' ); * // returns [ 'Hello ', {...}, '!' ] */ function formatTokenize( str ) { var content; var tokens; var match; var prev; tokens = []; prev = 0; match = RE.exec( str ); while ( match ) { content = str.slice( prev, RE.lastIndex - match[ 0 ].length ); if ( content.length ) { tokens.push( content ); } tokens.push( parse( match ) ); prev = RE.lastIndex; match = RE.exec( str ); } content = str.slice( prev ); if ( content.length ) { tokens.push( content ); } return tokens; } // EXPORTS // module.exports = formatTokenize;