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("<"); 0039 else if (ch == QLatin1Char('>')) 0040 rich += QLatin1String(">"); 0041 else if (ch == QLatin1Char('&')) 0042 rich += QLatin1String("&"); 0043 else if (ch == QLatin1Char('"')) 0044 rich += QLatin1String("""); 0045 else if (ch == QLatin1Char('\'')) 0046 rich += QLatin1String("'"); 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 */