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"