File indexing completed on 2025-02-09 04:28:38

0001 /*
0002   This file is part of the KTextTemplate library
0003 
0004   SPDX-FileCopyrightText: 2010 Stephen Kelly <steveire@gmail.com>
0005 
0006   SPDX-License-Identifier: LGPL-2.1-or-later
0007 
0008 */
0009 
0010 #include "outputstream.h"
0011 
0012 #include "safestring.h"
0013 
0014 using namespace KTextTemplate;
0015 
0016 OutputStream::OutputStream()
0017     : m_stream(nullptr)
0018 {
0019 }
0020 
0021 OutputStream::OutputStream(QTextStream *stream)
0022     : m_stream(stream)
0023 {
0024 }
0025 
0026 OutputStream::~OutputStream() = default;
0027 
0028 QString OutputStream::escape(const QString &input) const
0029 {
0030     // This could be replaced by QString::toHtmlEscaped()
0031     // but atm it does not escape single quotes
0032     QString rich;
0033     const int len = input.length();
0034     rich.reserve(int(len * 1.1));
0035     for (int i = 0; i < len; ++i) {
0036         const QChar ch = input.at(i);
0037         if (ch == QLatin1Char('<'))
0038             rich += QLatin1String("&lt;");
0039         else if (ch == QLatin1Char('>'))
0040             rich += QLatin1String("&gt;");
0041         else if (ch == QLatin1Char('&'))
0042             rich += QLatin1String("&amp;");
0043         else if (ch == QLatin1Char('"'))
0044             rich += QLatin1String("&quot;");
0045         else if (ch == QLatin1Char('\''))
0046             rich += QLatin1String("&#39;");
0047         else
0048             rich += ch;
0049     }
0050     rich.squeeze();
0051     return rich;
0052 }
0053 
0054 QString OutputStream::escape(const KTextTemplate::SafeString &input) const
0055 {
0056     return escape(input.get());
0057 }
0058 
0059 QString OutputStream::conditionalEscape(const KTextTemplate::SafeString &input) const
0060 {
0061     if (!input.isSafe())
0062         return escape(input.get());
0063     return input;
0064 }
0065 
0066 QSharedPointer<OutputStream> OutputStream::clone(QTextStream *stream) const
0067 {
0068     return QSharedPointer<OutputStream>(new OutputStream(stream));
0069 }
0070 
0071 OutputStream &OutputStream::operator<<(const QString &input)
0072 {
0073     if (m_stream)
0074         (*m_stream) << input;
0075     return *this;
0076 }
0077 
0078 OutputStream &OutputStream::operator<<(const KTextTemplate::SafeString &input)
0079 {
0080     if (m_stream) {
0081         if (input.needsEscape())
0082             (*m_stream) << escape(input.get());
0083         else
0084             (*m_stream) << input.get();
0085     }
0086     return *this;
0087 }
0088 /*
0089 OutputStream& OutputStream::operator<<(const
0090 KTextTemplate::OutputStream::Escape& e)
0091 {
0092   ( *m_stream ) << escape( e.m_content );
0093   return *this;
0094 }*/
0095 
0096 OutputStream &OutputStream::operator<<(QTextStream *stream)
0097 {
0098     if (m_stream)
0099         (*m_stream) << stream->readAll();
0100     return *this;
0101 }
0102 /*
0103 KTextTemplate::OutputStream::MarkSafe::MarkSafe(const QString& input)
0104   : m_safe( false ), m_content( input )
0105 {
0106 
0107 }
0108 
0109 KTextTemplate::OutputStream::MarkSafe::MarkSafe(const KTextTemplate::SafeString&
0110 input) : m_safe( input.isSafe() ), m_content( input.get() )
0111 {
0112 
0113 }
0114 */