console-feed-modern
Version:
A React component that displays console logs from the current page, an iframe or transported across a server
185 lines • 15.2 kB
JavaScript
// Taken from the source of chrome devtools:
// https://github.com/ChromeDevTools/devtools-frontend/blob/master/front_end/platform/utilities.js#L805-L1006
// Copyright 2014 The Chromium Authors. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
export var String;
(function (String) {
/**
* @param {string} string
* @param {number} index
* @return {boolean}
*/
function isDigitAt(string, index) {
var c = string.charCodeAt(index);
return 48 <= c && c <= 57;
}
/**
* @param {string} format
* @param {!Object.<string, function(string, ...):*>} formatters
* @return {!Array.<!Object>}
*/
function tokenizeFormatString(format, formatters) {
var tokens = [];
var substitutionIndex = 0;
function addStringToken(str) {
if (tokens.length && tokens[tokens.length - 1].type === 'string')
tokens[tokens.length - 1].value += str;
else
tokens.push({ type: 'string', value: str });
}
function addSpecifierToken(specifier, precision, substitutionIndex) {
tokens.push({
type: 'specifier',
specifier: specifier,
precision: precision,
substitutionIndex: substitutionIndex
});
}
var index = 0;
for (var precentIndex = format.indexOf('%', index); precentIndex !== -1; precentIndex = format.indexOf('%', index)) {
if (format.length === index)
// unescaped % sign at the end of the format string.
break;
addStringToken(format.substring(index, precentIndex));
index = precentIndex + 1;
if (format[index] === '%') {
// %% escape sequence.
addStringToken('%');
++index;
continue;
}
if (isDigitAt(format, index)) {
// The first character is a number, it might be a substitution index.
var number = parseInt(format.substring(index), 10);
while (isDigitAt(format, index))
++index;
// If the number is greater than zero and ends with a "$",
// then this is a substitution index.
if (number > 0 && format[index] === '$') {
substitutionIndex = number - 1;
++index;
}
}
var precision = -1;
if (format[index] === '.') {
// This is a precision specifier. If no digit follows the ".",
// then the precision should be zero.
++index;
precision = parseInt(format.substring(index), 10);
if (isNaN(precision))
precision = 0;
while (isDigitAt(format, index))
++index;
}
if (!(format[index] in formatters)) {
addStringToken(format.substring(precentIndex, index + 1));
++index;
continue;
}
addSpecifierToken(format[index], precision, substitutionIndex);
++substitutionIndex;
++index;
}
addStringToken(format.substring(index));
return tokens;
}
/**
* @param {string} format
* @param {?ArrayLike} substitutions
* @param {!Object.<string, function(string, ...):Q>} formatters
* @param {!T} initialValue
* @param {function(T, Q): T|undefined} append
* @param {!Array.<!Object>=} tokenizedFormat
* @return {!{formattedResult: T, unusedSubstitutions: ?ArrayLike}};
* @template T, Q
*/
function format(format, substitutions, formatters, initialValue, append, tokenizedFormat) {
if (!format || !substitutions || !substitutions.length)
return {
formattedResult: append(initialValue, format),
unusedSubstitutions: substitutions
};
function prettyFunctionName() {
return ('String.format("' +
format +
'", "' +
Array.prototype.join.call(substitutions, '", "') +
'")');
}
function warn(msg) {
console.warn(prettyFunctionName() + ': ' + msg);
}
function error(msg) {
console.error(prettyFunctionName() + ': ' + msg);
}
var result = initialValue;
var tokens = tokenizedFormat || tokenizeFormatString(format, formatters);
var usedSubstitutionIndexes = {};
for (var i = 0; i < tokens.length; ++i) {
var token = tokens[i];
if (token.type === 'string') {
result = append(result, token.value);
continue;
}
if (token.type !== 'specifier') {
error('Unknown token type "' + token.type + '" found.');
continue;
}
if (token.substitutionIndex >= substitutions.length) {
// If there are not enough substitutions for the current substitutionIndex
// just output the format specifier literally and move on.
error('not enough substitution arguments. Had ' +
substitutions.length +
' but needed ' +
(token.substitutionIndex + 1) +
', so substitution was skipped.');
result = append(result, '%' + (token.precision > -1 ? token.precision : '') + token.specifier);
continue;
}
usedSubstitutionIndexes[token.substitutionIndex] = true;
if (!(token.specifier in formatters)) {
// Encountered an unsupported format character, treat as a string.
warn('unsupported format character \u201C' +
token.specifier +
'\u201D. Treating as a string.');
result = append(result, substitutions[token.substitutionIndex]);
continue;
}
result = append(result, formatters[token.specifier](substitutions[token.substitutionIndex], token));
}
var unusedSubstitutions = [];
for (var i = 0; i < substitutions.length; ++i) {
if (i in usedSubstitutionIndexes)
continue;
unusedSubstitutions.push(substitutions[i]);
}
return { formattedResult: result, unusedSubstitutions: unusedSubstitutions };
}
String.format = format;
})(String || (String = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0NvbXBvbmVudC9kZXZ0b29scy1wYXJzZXIvc3RyaW5nLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRDQUE0QztBQUM1Qyw2R0FBNkc7QUFFN0csNERBQTREO0FBQzVELEVBQUU7QUFDRixxRUFBcUU7QUFDckUseUVBQXlFO0FBQ3pFLE9BQU87QUFDUCxFQUFFO0FBQ0Ysc0VBQXNFO0FBQ3RFLGdFQUFnRTtBQUNoRSwrREFBK0Q7QUFDL0QseUVBQXlFO0FBQ3pFLGdFQUFnRTtBQUNoRSxnQkFBZ0I7QUFDaEIsNERBQTREO0FBQzVELHVFQUF1RTtBQUN2RSwyREFBMkQ7QUFDM0QsRUFBRTtBQUNGLHNFQUFzRTtBQUN0RSxvRUFBb0U7QUFDcEUsd0VBQXdFO0FBQ3hFLHVFQUF1RTtBQUN2RSx3RUFBd0U7QUFDeEUsbUVBQW1FO0FBQ25FLHdFQUF3RTtBQUN4RSx3RUFBd0U7QUFDeEUsc0VBQXNFO0FBQ3RFLHdFQUF3RTtBQUN4RSx1RUFBdUU7QUFFdkUsTUFBTSxLQUFXLE1BQU0sQ0EyTXRCO0FBM01ELFdBQWlCLE1BQU07SUFDckI7Ozs7T0FJRztJQUNILFNBQVMsU0FBUyxDQUFDLE1BQVcsRUFBRSxLQUFVO1FBQ3hDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDaEMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDM0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLG9CQUFvQixDQUFDLE1BQVcsRUFBRSxVQUFlO1FBQ3hELElBQUksTUFBTSxHQUFRLEVBQUUsQ0FBQTtRQUNwQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQTtRQUV6QixTQUFTLGNBQWMsQ0FBQyxHQUFRO1lBQzlCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENB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