@@ -83,6 +83,7 @@ interface
8383 TPrettyPrintOutput = reference to procedure(const APrettyPrint: string);
8484 TTemplateResolver = reference to function(const AContext: ITemplateContext; const AName: string): ITemplate;
8585 TTemplateResolverWithContext = reference to function(const AContext: ITemplateContext; const AName: string; const AResolveContext: TTemplateValue; out ACacheInContext: boolean): ITemplate;
86+ TTemplateVariableResolver = reference to function(const AContext: ITemplateContext; const AName: string; out AResult: TValue): boolean;
8687
8788 ITemplateEvaluationContext = interface
8889 [' {FCE6891F-3D39-4CC4-8ADB-024D843C7770}' ]
@@ -168,6 +169,9 @@ interface
168169 function GetWhitespace : char;
169170 procedure SetWhiteSpace (const AWS: char);
170171
172+ function GetVariableResolver : TTemplateVariableResolver;
173+ procedure SetVariableResolver (const AResolver: TTemplateVariableResolver);
174+
171175 property Functions: ITemplateFunctions read GetFunctions write SetFunctions;
172176 property NewLine: string read GetNewLine write SetNewLine;
173177 property WhitespaceChar: char read GetWhitespace write SetWhiteSpace;
@@ -186,6 +190,7 @@ interface
186190 property StartStripToken: string read GetScriptStartStripToken write SetScriptStartStripToken;
187191 property EndStripToken: string read GetScriptEndStripToken write SetScriptEndStripToken;
188192
193+ property VariableResolver: TTemplateVariableResolver read GetVariableResolver write SetVariableResolver;
189194 property ValueSeparator: char read GetValueSeparator write SetValueSeparator;
190195 property DecimalSeparator: char read GetDecimalSeparator write SetDecimalSeparator;
191196 property FormatSettings: TFormatSettings read GetFormatSettings;
@@ -274,6 +279,7 @@ TTemplateContext = class(TInterfacedObject, ITemplateContext, ITemplateContext
274279 FDebugFormat: string;
275280 FPrettyPrintOutput: TPrettyPrintOutput;
276281 FWhiteSpace: char;
282+ FVariableResolver: TTemplateVariableResolver;
277283 public
278284 constructor Create(const AOptions: TTemplateEvaluationOptions);
279285 destructor Destroy; override;
@@ -361,6 +367,9 @@ TTemplateContext = class(TInterfacedObject, ITemplateContext, ITemplateContext
361367 function GetWhitespace : char;
362368 procedure SetWhiteSpace (const AWS: char);
363369
370+ function GetVariableResolver : TTemplateVariableResolver;
371+ procedure SetVariableResolver (const AResolver: TTemplateVariableResolver);
372+
364373 end ;
365374
366375function CreateTemplateContext (const AOptions: TTemplateEvaluationOptions): ITemplateContext;
@@ -526,7 +535,9 @@ function TTemplateContext.GetVariable(const AName: string): TValue;
526535begin
527536 FLock.Acquire;
528537 try
529- exit(FVariables[AName]);
538+ if TryGetVariable(AName, result) then
539+ exit;
540+ raise ETemplateVariableNotResolved.CreateResFmt(@SVariableNotResolved, [AName]);
530541 finally
531542 FLock.Release;
532543 end ;
@@ -537,6 +548,11 @@ function TTemplateContext.GetVariableEncoder: TTemplateEncodeFunction;
537548 result := FVariableEncoder;
538549end ;
539550
551+ function TTemplateContext.GetVariableResolver : TTemplateVariableResolver;
552+ begin
553+ result := FVariableResolver;
554+ end ;
555+
540556function TTemplateContext.GetVariables : ITemplateVariables;
541557begin
542558 exit(FVariables);
@@ -691,6 +707,11 @@ procedure TTemplateContext.SetVariableEncoder(const AEncoder: TTemplateEncodeFun
691707 FVariableEncoder := AEncoder;
692708end ;
693709
710+ procedure TTemplateContext.SetVariableResolver (const AResolver: TTemplateVariableResolver);
711+ begin
712+ FVariableResolver := AResolver;
713+ end ;
714+
694715procedure TTemplateContext.SetWhiteSpace (const AWS: char);
695716begin
696717 FWhiteSpace := AWS;
@@ -766,10 +787,14 @@ function TTemplateContext.TryGetVariable(const AName: string; out AValue: TValue
766787begin
767788 FLock.Enter;
768789 try
769- exit(FVariables.TryGetItem(AName, AValue));
790+ if FVariables.TryGetItem(AName, AValue) then
791+ exit(true);
792+ if assigned(FVariableResolver) then
793+ exit(FVariableResolver(self, AName, AValue));
770794 finally
771795 FLock.Leave;
772796 end ;
797+ exit(false);
773798end ;
774799
775800procedure TTemplateContext.Unmanage (const AObject: TObject);
0 commit comments