2
This file is part of the Grantlee template system.
4
Copyright (c) 2009,2010 Stephen Kelly <steveire@gmail.com>
6
This library is free software; you can redistribute it and/or
7
modify it under the terms of the GNU Lesser General Public
8
License as published by the Free Software Foundation; either version
9
2.1 of the Licence, or (at your option) any later version.
11
This library is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
Lesser General Public License for more details.
16
You should have received a copy of the GNU Lesser General Public
17
License along with this library. If not, see <http://www.gnu.org/licenses/>.
21
#ifndef GRANTLEE_CONTEXT_H
22
#define GRANTLEE_CONTEXT_H
24
#include "abstractlocalizer.h"
25
#include "grantlee_core_export.h"
27
#include <QtCore/QVariantHash>
36
/// @headerfile context.h grantlee/context.h
39
@brief The Context class holds the context to render a template with.
41
For application developers, using the Context class is a matter of inserting keys and
42
values as appropriate for rendering a template using the insert method.
45
Template t = engine->newTemplate( "Name is {% name %} and age is {% age %}.", "some_template" );
48
c1.insert( "name", "Tom" );
49
c1.insert( "age", 34 );
52
c2.insert( "name", "Harry" );
53
c2.insert( "age", 43 );
55
t->render(c1); // Returns "Name is Tom and age is 43."
56
t->render(c2); // Returns "Name is Harry and age is 34."
59
Note that one Template may be rendered multiple times with different contexts. Note also that any QVariant may be inserted
60
into a Context object. Most commonly, QObjects will be used here.
61
@see @ref custom_objects
63
@section context_stack Context Stack.
65
For template tag developers, some other Context API is relevant.
67
It is possible to push and pop layers of context while a template is being rendered. This is useful if your template
68
tag makes additional variables temporarily available in a part of a template. Template tags should only modify layers of context
69
that they push themselves, and should pop any layers created before finishing its rendering step.
71
See for example the @gr_tag{with} tag. In a template such as
74
{% with person.name|toUpper as lowerName %}
75
Name is {% lowerName %}
79
In this case, lowerName is available in the context only between the @gr_tag{with} and @gr_tag{endwith} tags. The implementation of
80
the @gr_tag{with} tag render method is:
83
void WithNode::render( OutputStream *stream, Context *c )
86
// {% with m_filterExpression as m_name %}
87
c->insert( m_name, m_filterExpression.resolve( c ) );
88
m_list.render( stream, c );
89
c->pop(); // The section of context defining m_name is removed.
93
Note that a context may temporarily override a variable in a parent context. This is why it is important to push a new context when
94
adding items to context and pop it when finished.
98
{% with "foo" as var %}
99
Var is {% var %} // Var is "foo"
100
{% with "bar" as var %}
101
Var is {% var %} // Var is "bar"
103
Var is {% var %} // Var is "foo"
107
@author Stephen Kelly <steveire@gmail.com>
109
class GRANTLEE_CORE_EXPORT Context
114
Creates an empty context
118
Sets every key in the hash as a property name with the variant as the value.
120
explicit Context( const QVariantHash &hash );
126
Context( const Context &other );
131
Context& operator =( const Context &other );
137
Whether to automatically escape all context content. This is not usually used directly. Use the @gr_tag{autoescape} tag instead.
139
bool autoEscape() const;
144
Sets whether to automatically escape all context content. This is not usually used directly. Use the @gr_tag{autoescape} tag instead.
146
void setAutoEscape( bool autoescape );
154
Returns the context object identified by the key @p str
156
QVariant lookup( const QString &str ) const;
159
Insert the context object @p variant identified by @p name into the Context.
161
void insert( const QString &name, const QVariant &variant );
164
Pushes a new context.
165
@see @ref context_stack
171
@see @ref context_stack
177
@internal Returns the context hash at depth @p depth.
179
QVariantHash stackHash( int depth ) const;
183
Returns whether template being rendered is being mutated.
185
bool isMutating() const;
189
Sets whether template being rendered is being mutated to @p mutating.
191
void setMutating( bool mutating );
196
void addExternalMedia( const QString &absolutePart, const QString &relativePart );
201
void clearExternalMedia();
205
Sets the localizer to be used.
207
The Context takes ownerwhip of the localizer.
209
void setLocalizer( AbstractLocalizer::Ptr localizer );
212
Returns the localizer currently in use.
214
AbstractLocalizer::Ptr localizer() const;
217
Returns the external media encountered in the Template while rendering.
219
QList<QPair<QString, QString> > externalMedia() const;
222
The type of urls to external media that should be put in the template.
226
AbsoluteUrls, ///< Absolute URLs should be put in the template.
227
RelativeUrls ///< Relative URLs should be put in the template.
231
Sets the type of external media URL to be used in the template to @p type.
232
@see @ref media_finder_tag
234
void setUrlType( UrlType type );
237
The type of URL used in the template.
239
UrlType urlType() const;
242
Sets the relative path to external media to be used in templates to @p relativePath
243
@see @ref media_finder_tag
245
void setRelativeMediaPath( const QString &relativePath );
248
The relative path to external media to be used in templates.
250
QString relativeMediaPath() const;
253
* Returns a modifiable RenderContext for the Node @p scopeNode. This may be used to make
254
* Template rendering threadsafe so that render state does not need to be stored in the
255
* Node implementation itself.
257
RenderContext* renderContext() const;
260
Q_DECLARE_PRIVATE( Context )
261
ContextPrivate * const d_ptr;