Refactored the Kernel registration fluent interface to be more readable, better suppo...
[castle.git] / MonoRail / Castle.MonoRail.Framework.Views.NVelocity / CustomDirectives / CaptureForDirective.cs
blob35c672cbd97dfc0591348b9c643f852ea1b05381
1 // Copyright 2004-2008 Castle Project - http://www.castleproject.org/
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
15 using NVelocity.Runtime.Directive;
16 using NVelocity.Context;
17 using NVelocity.Runtime.Parser.Node;
19 namespace Castle.MonoRail.Framework.Views.NVelocity.CustomDirectives
21 using System;
22 using System.IO;
23 using System.Text;
25 public class CaptureForDirective : Directive
27 /// <summary>
28 /// Render's the contents of the directive and store them in the context
29 /// variable so it can be referenced later on the template
30 ///
31 /// #capturefor(someId)
32 /// Some content goes here
33 /// #end
34 ///
35 /// $someId
36 /// </summary>
37 public CaptureForDirective()
41 public override bool Render(IInternalContextAdapter context, TextWriter writer, INode node)
43 if (node.ChildrenCount != 2)
45 throw new MonoRailException("#capturefor directive expects an id attribute and a template block");
48 ASTWord idNode = (ASTWord) node.GetChild(0);
49 ASTBlock bodyNode = (ASTBlock) node.GetChild(1);
51 string id = idNode.Literal;
53 StringWriter buffer = new StringWriter();
54 StringBuilder sb = buffer.GetStringBuilder();
56 bodyNode.Render(context, buffer);
58 String currentContent = context[id] as string;
60 if( currentContent != null )
62 sb.Append(currentContent);
65 context[id] = sb.ToString();
67 return true;
70 public override String Name
72 get { return "capturefor"; }
73 set { }
76 public override DirectiveType Type
78 get { return DirectiveType.BLOCK; }