1 // Copyright 2004-2008 Castle Project - http://www.castleproject.org/
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
7 // http://www.apache.org/licenses/LICENSE-2.0
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
25 public class CaptureForDirective
: Directive
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
31 /// #capturefor(someId)
32 /// Some content goes here
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();
70 public override String Name
72 get { return "capturefor"; }
76 public override DirectiveType Type
78 get { return DirectiveType.BLOCK; }