From 1997dcdb5dde3c94e82c5e07ada044a51c5d0897 Mon Sep 17 00:00:00 2001 From: Diyar Oktay Date: Thu, 25 Apr 2024 19:21:37 +0200 Subject: [PATCH 1/2] Escape curly braces --- README.md | 7 +++++++ logtape/logger.test.ts | 8 ++++++++ logtape/logger.ts | 37 +++++++++++++++++++++++++------------ 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 040f073..39b549f 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,13 @@ logger.debug("Or you can use a function call: {value}.", () => { }); ~~~~ +When using the function call, the way to log single curly braces `{` is to +double the brace `{{`: + +~~~~ typescript +logger.debug("This logs {{single}} curly braces."); +~~~~ + Categories ---------- diff --git a/logtape/logger.test.ts b/logtape/logger.test.ts index 7c2d60b..2ec8026 100644 --- a/logtape/logger.test.ts +++ b/logtape/logger.test.ts @@ -427,10 +427,18 @@ Deno.test("parseMessageTemplate()", () => { parseMessageTemplate("Hello, world!", { foo: 123 }), ["Hello, world!"], ); + assertEquals( + parseMessageTemplate("Hello, {{world}}!", { foo: 123 }), + ["Hello, {world}!"], + ); assertEquals( parseMessageTemplate("Hello, {foo}!", { foo: 123 }), ["Hello, ", 123, "!"], ); + assertEquals( + parseMessageTemplate("Hello, {{foo}}!", { foo: 123 }), + ["Hello, {foo}!"], + ); assertEquals( parseMessageTemplate("Hello, {bar}!", { foo: 123 }), ["Hello, ", undefined, "!"], diff --git a/logtape/logger.ts b/logtape/logger.ts index 00161c3..f966a0e 100644 --- a/logtape/logger.ts +++ b/logtape/logger.ts @@ -601,8 +601,6 @@ export class LoggerImpl implements Logger { */ const metaLogger = LoggerImpl.getLogger(["logtape", "meta"]); -const MESSAGE_TEMPLATE_PATTERN = /\{([^}]*)\}/g; - /** * Parse a message template into a message template array and a values array. * @param template The message template. @@ -613,19 +611,34 @@ export function parseMessageTemplate( template: string, properties: Record, ): readonly unknown[] { - let lastPos = 0; const message: unknown[] = []; - while (true) { - const match = MESSAGE_TEMPLATE_PATTERN.exec(template); - if (match == null) { - message.push(template.substring(lastPos)); - break; + let part = ""; + for (let i = 0; i < template.length; i++) { + const char = template.charAt(i); + const nextChar = template.charAt(i + 1); + + if (char == "{" && nextChar == "{") { + // Escaped { character + part = part + char; + i++; + } else if (char == "}" && nextChar == "}") { + // Escaped } character + part = part + char; + i++; + } else if (char == "{") { + // Start of a placeholder + message.push(part); + part = ""; + } else if (char == "}") { + // End of a placeholder + message.push(properties[part]); + part = ""; + } else { + // Default case + part = part + char; } - message.push(template.substring(lastPos, match.index)); - const key = match[1]; - message.push(properties[key]); - lastPos = match.index + match[0].length; } + message.push(part); return message; } From c94ae94be5432aeb49f9a6dbf9c5e7f14305e7fa Mon Sep 17 00:00:00 2001 From: Diyar Oktay Date: Fri, 26 Apr 2024 15:30:45 +0200 Subject: [PATCH 2/2] fixup! Escape curly braces --- CHANGES.md | 2 ++ logtape/logger.test.ts | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index a927e9a..22834ee 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,8 @@ Version 0.4.0 To be released. +- Curly braces can now be escaped with double curly braces + Version 0.3.0 ------------- diff --git a/logtape/logger.test.ts b/logtape/logger.test.ts index 2ec8026..4c80a55 100644 --- a/logtape/logger.test.ts +++ b/logtape/logger.test.ts @@ -455,6 +455,10 @@ Deno.test("parseMessageTemplate()", () => { parseMessageTemplate("Hello, {foo}, {bar}", { foo: 123, bar: 456 }), ["Hello, ", 123, ", ", 456, ""], ); + assertEquals( + parseMessageTemplate("Hello, {{world!", { foo: 123 }), + ["Hello, {world!"], + ); }); Deno.test("renderMessage()", () => {