This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch html_layout_fix
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git

commit d617f0c00dc9d39b9afe2f7a6c8336fe1ec42a1d
Author: Stephen Webb <[email protected]>
AuthorDate: Fri Jul 11 12:31:14 2025 +1000

    Emit '&quot;' instead of '"' in XML and html attributes
---
 src/main/cpp/htmllayout.cpp                  |  2 +-
 src/main/cpp/transform.cpp                   | 24 ++++++++++++++++++++++++
 src/main/cpp/xmllayout.cpp                   | 20 ++++++++++----------
 src/main/include/log4cxx/helpers/transform.h |  7 +++++++
 4 files changed, 42 insertions(+), 11 deletions(-)

diff --git a/src/main/cpp/htmllayout.cpp b/src/main/cpp/htmllayout.cpp
index c2411ece..f0aceea0 100644
--- a/src/main/cpp/htmllayout.cpp
+++ b/src/main/cpp/htmllayout.cpp
@@ -127,7 +127,7 @@ void HTMLLayout::format(LogString& output,
        output.append(LOG4CXX_EOL);
 
        output.append(LOG4CXX_STR("<td title=\""));
-       output.append(event->getLoggerName());
+       Transform::appendEscapingQuote(output, event->getLoggerName());
        output.append(LOG4CXX_STR(" logger\">"));
        Transform::appendEscapingTags(output, event->getLoggerName());
        output.append(LOG4CXX_STR("</td>"));
diff --git a/src/main/cpp/transform.cpp b/src/main/cpp/transform.cpp
index 6cc7ca77..b467a6ed 100644
--- a/src/main/cpp/transform.cpp
+++ b/src/main/cpp/transform.cpp
@@ -130,3 +130,27 @@ void Transform::appendEscapingCDATA(
        buf.append(input, start, input.length() - start);
 }
 
+void Transform::appendEscapingQuote(
+       LogString& buf, const LogString& input)
+{
+       if (input.empty())
+               return;
+       logchar quote { 0x22 /* " */ };
+       size_t start = 0;
+       size_t index = input.find(quote, start);
+
+       while (index != input.npos)
+       {
+               if (start < index)
+                       buf.append(input, start, index - start);
+               buf.append(LOG4CXX_STR("&quot;"));
+        start = index + 1;
+               if (start < input.size())
+                       index = input.find(quote, start);
+               else
+                       index = input.npos;
+       }
+
+       if (start < input.size())
+               buf.append(input, start, input.size() - start);
+}
diff --git a/src/main/cpp/xmllayout.cpp b/src/main/cpp/xmllayout.cpp
index 0b7fe073..35904a9d 100644
--- a/src/main/cpp/xmllayout.cpp
+++ b/src/main/cpp/xmllayout.cpp
@@ -80,13 +80,13 @@ void XMLLayout::format(LogString& output,
 {
        output.reserve(m_priv->expectedPatternLength + 
event->getMessage().size());
        output.append(LOG4CXX_STR("<log4j:event logger=\""));
-       Transform::appendEscapingTags(output, event->getLoggerName());
+       Transform::appendEscapingQuote(output, event->getLoggerName());
        output.append(LOG4CXX_STR("\" timestamp=\""));
        StringHelper::toString(event->getTimeStamp() / 1000L, p, output);
        output.append(LOG4CXX_STR("\" level=\""));
-       Transform::appendEscapingTags(output, event->getLevel()->toString());
+       Transform::appendEscapingQuote(output, event->getLevel()->toString());
        output.append(LOG4CXX_STR("\" thread=\""));
-       Transform::appendEscapingTags(output, event->getThreadName());
+       Transform::appendEscapingQuote(output, event->getThreadName());
        output.append(LOG4CXX_STR("\">"));
        output.append(LOG4CXX_EOL);
 
@@ -112,13 +112,13 @@ void XMLLayout::format(LogString& output,
                output.append(LOG4CXX_STR("<log4j:locationInfo class=\""));
                const LocationInfo& locInfo = event->getLocationInformation();
                LOG4CXX_DECODE_CHAR(className, locInfo.getClassName());
-               Transform::appendEscapingTags(output, className);
+               Transform::appendEscapingQuote(output, className);
                output.append(LOG4CXX_STR("\" method=\""));
                LOG4CXX_DECODE_CHAR(method, locInfo.getMethodName());
-               Transform::appendEscapingTags(output, method);
+               Transform::appendEscapingQuote(output, method);
                output.append(LOG4CXX_STR("\" file=\""));
                LOG4CXX_DECODE_CHAR(fileName, locInfo.getFileName());
-               Transform::appendEscapingTags(output, fileName);
+               Transform::appendEscapingQuote(output, fileName);
                output.append(LOG4CXX_STR("\" line=\""));
                StringHelper::toString(locInfo.getLineNumber(), p, output);
                output.append(LOG4CXX_STR("\"/>"));
@@ -142,9 +142,9 @@ void XMLLayout::format(LogString& output,
                                if (event->getMDC(key, value))
                                {
                                        output.append(LOG4CXX_STR("<log4j:data 
name=\""));
-                                       Transform::appendEscapingTags(output, 
key);
+                                       Transform::appendEscapingQuote(output, 
key);
                                        output.append(LOG4CXX_STR("\" 
value=\""));
-                                       Transform::appendEscapingTags(output, 
value);
+                                       Transform::appendEscapingQuote(output, 
value);
                                        output.append(LOG4CXX_STR("\"/>"));
                                        output.append(LOG4CXX_EOL);
                                }
@@ -157,9 +157,9 @@ void XMLLayout::format(LogString& output,
                                if (event->getProperty(key, value))
                                {
                                        output.append(LOG4CXX_STR("<log4j:data 
name=\""));
-                                       Transform::appendEscapingTags(output, 
key);
+                                       Transform::appendEscapingQuote(output, 
key);
                                        output.append(LOG4CXX_STR("\" 
value=\""));
-                                       Transform::appendEscapingTags(output, 
value);
+                                       Transform::appendEscapingQuote(output, 
value);
                                        output.append(LOG4CXX_STR("\"/>"));
                                        output.append(LOG4CXX_EOL);
                                }
diff --git a/src/main/include/log4cxx/helpers/transform.h 
b/src/main/include/log4cxx/helpers/transform.h
index 4ae67aac..09ae0119 100644
--- a/src/main/include/log4cxx/helpers/transform.h
+++ b/src/main/include/log4cxx/helpers/transform.h
@@ -54,6 +54,13 @@ class LOG4CXX_EXPORT Transform
                */
                static void appendEscapingCDATA(
                        LogString& buf, const LogString& input);
+
+               /**
+               * Add \c input to \c buf with double quote characters replaced 
with <b>&amp;quot;</b>.
+               *
+               * @param buf output stream holding the XML data to this point.
+               */
+               static void appendEscapingQuote(LogString& buf, const 
LogString& input);
 }; // class Transform
 }  // namespace helpers
 } //namespace log4cxx

Reply via email to