File indexing completed on 2025-02-09 04:28:40
0001 /* 0002 This file is part of the KTextTemplate library 0003 0004 SPDX-FileCopyrightText: 2009, 2010 Stephen Kelly <steveire@gmail.com> 0005 0006 SPDX-License-Identifier: LGPL-2.1-or-later 0007 0008 */ 0009 0010 #include "template.h" 0011 #include "template_p.h" 0012 0013 #include "context.h" 0014 #include "engine.h" 0015 #include "lexer_p.h" 0016 #include "parser.h" 0017 #include "rendercontext.h" 0018 0019 #include <QLoggingCategory> 0020 0021 Q_LOGGING_CATEGORY(KTEXTTEMPLATE_TEMPLATE, "kf.texttemplate") 0022 0023 using namespace KTextTemplate; 0024 0025 NodeList TemplatePrivate::compileString(const QString &str) 0026 { 0027 Q_Q(TemplateImpl); 0028 Lexer l(str); 0029 Parser p(l.tokenize(m_smartTrim ? Lexer::SmartTrim : Lexer::NoSmartTrim), q); 0030 0031 return p.parse(q); 0032 } 0033 0034 TemplateImpl::TemplateImpl(Engine const *engine, QObject *parent) 0035 : QObject(parent) 0036 , d_ptr(new TemplatePrivate(engine, false, this)) 0037 { 0038 } 0039 0040 TemplateImpl::TemplateImpl(Engine const *engine, bool smartTrim, QObject *parent) 0041 : QObject(parent) 0042 , d_ptr(new TemplatePrivate(engine, smartTrim, this)) 0043 { 0044 } 0045 0046 TemplateImpl::~TemplateImpl() 0047 { 0048 delete d_ptr; 0049 } 0050 0051 void TemplateImpl::setContent(const QString &templateString) 0052 { 0053 Q_D(Template); 0054 if (templateString.isEmpty()) 0055 return; 0056 0057 try { 0058 d->m_nodeList = d->compileString(templateString); 0059 d->setError(NoError, QString()); 0060 } catch (KTextTemplate::Exception &e) { 0061 qCWarning(KTEXTTEMPLATE_TEMPLATE) << e.what(); 0062 d->setError(e.errorCode(), e.what()); 0063 } 0064 } 0065 0066 QString TemplateImpl::render(Context *c) const 0067 { 0068 QString output; 0069 QTextStream textStream(&output); 0070 OutputStream outputStream(&textStream); 0071 render(&outputStream, c); 0072 return output; 0073 } 0074 0075 OutputStream *TemplateImpl::render(OutputStream *stream, Context *c) const 0076 { 0077 Q_D(const Template); 0078 0079 c->clearExternalMedia(); 0080 0081 c->renderContext()->push(); 0082 0083 try { 0084 d->m_nodeList.render(stream, c); 0085 d->setError(NoError, QString()); 0086 } catch (KTextTemplate::Exception &e) { 0087 qCWarning(KTEXTTEMPLATE_TEMPLATE) << e.what(); 0088 d->setError(e.errorCode(), e.what()); 0089 } 0090 0091 c->renderContext()->pop(); 0092 0093 return stream; 0094 } 0095 0096 NodeList TemplateImpl::nodeList() const 0097 { 0098 Q_D(const Template); 0099 return d->m_nodeList; 0100 } 0101 0102 void TemplateImpl::setNodeList(const NodeList &list) 0103 { 0104 Q_D(Template); 0105 d->m_nodeList = list; 0106 } 0107 0108 void TemplatePrivate::setError(Error type, const QString &message) const 0109 { 0110 m_error = type; 0111 m_errorString = message; 0112 } 0113 0114 Error TemplateImpl::error() const 0115 { 0116 Q_D(const Template); 0117 return d->m_error; 0118 } 0119 0120 QString TemplateImpl::errorString() const 0121 { 0122 Q_D(const Template); 0123 return d->m_errorString; 0124 } 0125 0126 Engine const *TemplateImpl::engine() const 0127 { 0128 Q_D(const Template); 0129 return d->m_engine.data(); 0130 } 0131 0132 #include "moc_template.cpp"