Make the Grantlee::Node::render method const.
[grantlee:grantlee.git] / templates / i18n / i18ncp.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 "i18ncp.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 I18ncpNodeFactory::I18ncpNodeFactory()
36 {
37
38 }
39
40 Node* I18ncpNodeFactory::getNode( const QString& tagContent, Parser* p ) const
41 {
42   QStringList expr = smartSplit( tagContent );
43
44   if ( expr.size() < 4 )
45     throw Grantlee::Exception( TagSyntaxError, QLatin1String( "Error: i18ncp tag takes at least three arguments" ) );
46
47   QString contextText = expr.at( 1 );
48
49   if ( !( contextText.startsWith( QLatin1Char( '"' ) ) && contextText.endsWith( QLatin1Char( '"' ) ) )
50        && !( contextText.startsWith( QLatin1Char( '\'' ) ) && contextText.endsWith( QLatin1Char( '\'' ) ) ) ) {
51     throw Grantlee::Exception( TagSyntaxError, QLatin1String( "Error: i18ncp tag first argument must be a static string." ) );
52   }
53   contextText = contextText.mid( 1, contextText.size() - 2 );
54
55   QString sourceText = expr.at( 2 );
56
57   if ( !( sourceText.startsWith( QLatin1Char( '"' ) ) && sourceText.endsWith( QLatin1Char( '"' ) ) )
58        && !( sourceText.startsWith( QLatin1Char( '\'' ) ) && sourceText.endsWith( QLatin1Char( '\'' ) ) ) ) {
59     throw Grantlee::Exception( TagSyntaxError, QLatin1String( "Error: i18ncp tag second argument must be a static string." ) );
60   }
61   sourceText = sourceText.mid( 1, sourceText.size() - 2 );
62
63   QString pluralText = expr.at( 3 );
64
65   int argsStart = 4;
66   if ( !( pluralText.startsWith( QLatin1Char( '"' ) ) && pluralText.endsWith( QLatin1Char( '"' ) ) )
67        && !( pluralText.startsWith( QLatin1Char( '\'' ) ) && pluralText.endsWith( QLatin1Char( '\'' ) ) ) ) {
68     argsStart = 3;
69     pluralText = sourceText;
70   } else {
71     pluralText = pluralText.mid( 1, pluralText.size() - 2 );
72   }
73
74   QList<FilterExpression> feList;
75   for ( int i = argsStart; i < expr.size(); ++i ) {
76     feList.append( FilterExpression( expr.at( i ), p ) );
77   }
78
79   return new I18ncpNode( contextText, sourceText, pluralText, feList );
80 }
81
82
83 I18ncpVarNodeFactory::I18ncpVarNodeFactory()
84 {
85
86 }
87
88 Grantlee::Node* I18ncpVarNodeFactory::getNode( const QString& tagContent, Parser* p ) const
89 {
90   QStringList expr = smartSplit( tagContent );
91
92   if ( expr.size() < 6 ) {
93     throw Grantlee::Exception( TagSyntaxError, QLatin1String( "Error: i18ncp_var tag takes at least five arguments" ) );
94   }
95
96   QString contextText = expr.at( 1 );
97
98   if ( !( contextText.startsWith( QLatin1Char( '"' ) ) && contextText.endsWith( QLatin1Char( '"' ) ) )
99        && !( contextText.startsWith( QLatin1Char( '\'' ) ) && contextText.endsWith( QLatin1Char( '\'' ) ) ) ) {
100     throw Grantlee::Exception( TagSyntaxError, QLatin1String( "Error: i18ncp_var tag first argument must be a static string." ) );
101   }
102   contextText = contextText.mid( 1, contextText.size() - 2 );
103
104   QString sourceText = expr.at( 2 );
105
106   if ( !( sourceText.startsWith( QLatin1Char( '"' ) ) && sourceText.endsWith( QLatin1Char( '"' ) ) )
107        && !( sourceText.startsWith( QLatin1Char( '\'' ) ) && sourceText.endsWith( QLatin1Char( '\'' ) ) ) ) {
108     throw Grantlee::Exception( TagSyntaxError, QLatin1String( "Error: i18ncp_var tag second argument must be a static string." ) );
109   }
110   sourceText = sourceText.mid( 1, sourceText.size() - 2 );
111
112   QString pluralText = expr.at( 3 );
113
114   int argsStart = 4;
115   if ( !( pluralText.startsWith( QLatin1Char( '"' ) ) && pluralText.endsWith( QLatin1Char( '"' ) ) )
116        && !( pluralText.startsWith( QLatin1Char( '\'' ) ) && pluralText.endsWith( QLatin1Char( '\'' ) ) ) ) {
117     argsStart = 3;
118     pluralText = sourceText;
119   } else {
120     pluralText = pluralText.mid( 1, pluralText.size() - 2 );
121   }
122
123   QList<FilterExpression> feList;
124   for ( int i = argsStart; i < expr.size() - 2; ++i ) {
125     feList.append( FilterExpression( expr.at( i ), p ) );
126   }
127
128   QString resultName = expr.last();
129
130   return new I18ncpVarNode( contextText, sourceText, pluralText, feList, resultName );
131 }
132
133
134 I18ncpNode::I18ncpNode( const QString &contextText, const QString &sourceText, const QString &pluralText, const QList<Grantlee::FilterExpression>& feList, QObject* parent )
135   : Node( parent ), m_contextText(contextText), m_sourceText( sourceText ), m_pluralText( pluralText ), m_filterExpressionList( feList )
136 {
137
138 }
139
140 void I18ncpNode::render( OutputStream* stream, Context* c ) const
141 {
142   QVariantList args;
143   Q_FOREACH( const FilterExpression &fe, m_filterExpressionList )
144     args.append( fe.resolve( c ) );
145   QString resultString = c->localizer()->localizePluralContextString( m_sourceText, m_pluralText, m_contextText, args );
146
147   streamValueInContext( stream, resultString, c );
148 }
149
150 I18ncpVarNode::I18ncpVarNode( const QString &contextText, const QString &sourceText, const QString &pluralText, const QList<Grantlee::FilterExpression> &feList, const QString &resultName, QObject* parent )
151   : Node( parent ), m_contextText(contextText), m_sourceText( sourceText ), m_pluralText( pluralText ), m_filterExpressionList( feList ), m_resultName( resultName )
152 {
153
154 }
155
156 void I18ncpVarNode::render( OutputStream* stream, Context* c ) const
157 {
158   Q_UNUSED( stream )
159   QVariantList args;
160   Q_FOREACH( const FilterExpression &fe, m_filterExpressionList )
161     args.append( fe.resolve( c ) );
162   QString resultString = c->localizer()->localizePluralContextString( m_sourceText, m_pluralText, m_contextText, args );
163
164   c->insert( m_resultName, resultString );
165 }