Make the Grantlee::Node::render method const.
[grantlee:grantlee.git] / templates / i18n / i18n.cpp
1 /*
2   This file is part of the Grantlee template system.
3
4   Copyright (c) 2010 Stephen Kelly <steveire@gmail.com>
5
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 of the Licence, or (at your option) any later version.
10
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   Library General Public License for more details.
15
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/>.
18
19 */
20
21 #include "i18n.h"
22
23 #include <QtCore/QStringList>
24
25 #include "abstractlocalizer.h"
26 #include "parser.h"
27 #include "template.h"
28 #include "engine.h"
29 #include "exception.h"
30
31 #include <QtCore/QDebug>
32 #include <util.h>
33 #include <complex>
34
35 I18nNodeFactory::I18nNodeFactory()
36 {
37
38 }
39
40 Node* I18nNodeFactory::getNode( const QString& tagContent, Parser* p ) const
41 {
42   QStringList expr = smartSplit( tagContent );
43
44   if ( expr.size() < 2 )
45     throw Grantlee::Exception( TagSyntaxError, QLatin1String( "Error: i18n tag takes at least one argument" ) );
46
47   QString sourceText = expr.at( 1 );
48   int size = sourceText.size();
49
50   if ( !( sourceText.startsWith( QLatin1Char( '"' ) ) && sourceText.endsWith( QLatin1Char( '"' ) ) )
51        && !( sourceText.startsWith( QLatin1Char( '\'' ) ) && sourceText.endsWith( QLatin1Char( '\'' ) ) ) ) {
52     throw Grantlee::Exception( TagSyntaxError, QLatin1String( "Error: i18n tag first argument must be a static string." ) );
53   }
54   sourceText = sourceText.mid( 1, size - 2 );
55
56   QList<FilterExpression> feList;
57   for ( int i = 2; i < expr.size(); ++i ) {
58     feList.append( FilterExpression( expr.at( i ), p ) );
59   }
60
61   return new I18nNode( sourceText, feList );
62 }
63
64
65 I18nVarNodeFactory::I18nVarNodeFactory()
66 {
67
68 }
69
70 Grantlee::Node* I18nVarNodeFactory::getNode( const QString& tagContent, Parser* p ) const
71 {
72
73   QStringList expr = smartSplit( tagContent );
74
75   if ( expr.size() < 4 )
76     throw Grantlee::Exception( TagSyntaxError, QLatin1String( "Error: i18n_var tag takes at least three arguments" ) );
77
78   QString sourceText = expr.at( 1 );
79   int size = sourceText.size();
80
81   if ( !( sourceText.startsWith( QLatin1Char( '"' ) ) && sourceText.endsWith( QLatin1Char( '"' ) ) )
82        && !( sourceText.startsWith( QLatin1Char( '\'' ) ) && sourceText.endsWith( QLatin1Char( '\'' ) ) ) ) {
83     throw Grantlee::Exception( TagSyntaxError, QLatin1String( "Error: i18n tag first argument must be a static string." ) );
84   }
85   sourceText = sourceText.mid( 1, size - 2 );
86
87   QList<FilterExpression> feList;
88   for ( int i = 2; i < expr.size() - 2; ++i ) {
89     feList.append( FilterExpression( expr.at( i ), p ) );
90   }
91
92   QString resultName = expr.last();
93
94   return new I18nVarNode( sourceText, feList, resultName );
95 }
96
97
98 I18nNode::I18nNode( const QString &sourceText, const QList<Grantlee::FilterExpression>& feList, QObject* parent )
99   : Node( parent ), m_sourceText( sourceText ), m_filterExpressionList( feList )
100 {
101
102 }
103
104 void I18nNode::render( OutputStream* stream, Context* c ) const
105 {
106   QVariantList args;
107   Q_FOREACH( const FilterExpression &fe, m_filterExpressionList )
108     args.append( fe.resolve( c ) );
109   const QString resultString = c->localizer()->localizeString( m_sourceText, args );
110
111   streamValueInContext( stream, resultString, c );
112 }
113
114 I18nVarNode::I18nVarNode( const QString &sourceText, const QList<Grantlee::FilterExpression>& feList, const QString &resultName, QObject* parent )
115   : Node( parent ), m_sourceText( sourceText ), m_filterExpressionList( feList ), m_resultName( resultName )
116 {
117
118 }
119
120 void I18nVarNode::render( OutputStream* stream, Context* c ) const
121 {
122   Q_UNUSED( stream )
123   QVariantList args;
124   Q_FOREACH( const FilterExpression &fe, m_filterExpressionList )
125     args.append( fe.resolve( c ) );
126   QString resultString = c->localizer()->localizeString( m_sourceText, args );
127
128   c->insert( m_resultName, resultString );
129 }