14 using System.Collections.Generic;
18 using Irony.Interpreter;
20 namespace Irony.Interpreter.Ast {
22 #region embedded classes
27 class TemplateSegment {
28 public SegmentType Type;
32 public TemplateSegment(
string text,
AstNode node,
int position) {
33 Type = node == null? SegmentType.Text : SegmentType.Expression;
35 ExpressionNode = node;
39 class SegmentList :
List<TemplateSegment> { }
45 SegmentList _segments =
new SegmentList();
48 base.Init(context, treeNode);
49 _template = treeNode.Token.ValueString;
50 _tokenText = treeNode.Token.Text;
52 ParseSegments(context);
53 AsString =
"\"" + _template +
"\" (templated string)";
59 var value = BuildString(context);
60 context.Data.Push(value);
69 var exprParser =
new Parser(context.
Language, _templateSettings.ExpressionRoot);
73 int currentPos = 0, exprPosInTokenText = 0;
75 var startTagPos = _template.IndexOf(_templateSettings.StartTag, currentPos);
76 if (startTagPos < 0) startTagPos = _template.Length;
77 var text = _template.Substring(currentPos, startTagPos - currentPos);
78 if (!
string.IsNullOrEmpty(text))
79 _segments.Add(
new TemplateSegment(text, null, 0));
80 if (startTagPos >= _template.Length)
83 currentPos = startTagPos + _templateSettings.StartTag.Length;
84 var endTagPos = _template.IndexOf(_templateSettings.EndTag, currentPos);
89 var exprText = _template.Substring(currentPos, endTagPos - currentPos);
90 if(!
string.IsNullOrEmpty(exprText)) {
94 var exprTree = exprParser.Parse(exprText);
95 if(exprTree.HasErrors()) {
97 var baseLocation = this.Location + _tokenText.IndexOf(exprText);
102 exprPosInTokenText = _tokenText.IndexOf(_templateSettings.StartTag, exprPosInTokenText) + _templateSettings.StartTag.Length;
103 _segments.Add(
new TemplateSegment(null, exprTree.Root.AstNode as AstNode, exprPosInTokenText));
105 exprPosInTokenText += exprText.Length + _templateSettings.EndTag.Length;
108 currentPos = endTagPos + _templateSettings.EndTag.Length;
113 var initialStackCount = context.Data.Count;
114 string[] values =
new string[_segments.Count];
115 for(
int i = 0; i < _segments.Count; i++) {
116 var segment = _segments[i];
117 switch(segment.Type) {
118 case SegmentType.Text:
119 values[i] = segment.Text;
121 case SegmentType.Expression:
122 values[i] = EvaluateExpression(context, segment);
123 context.Data.PopUntil(initialStackCount);
127 var result = string.Join(string.Empty, values);
131 private string EvaluateExpression(
EvaluationContext context, TemplateSegment segment) {
133 segment.ExpressionNode.Evaluate(context, AstMode.Read);
134 var value = context.LastResult;
135 return value == null ? string.Empty : value.ToString();
137 this.ErrorAnchor = this.Location + segment.Position + ex.Location;
138 throw ex.InnerException;
static string ErrNoEndTagInEmbExpr
Looks up a localized string similar to No ending tag '{0}' found in embedded expression..
static string ErrAssignLiteralValue
Looks up a localized string similar to Invalide operation, attempt to assign constant or literal valu...
override void Init(ParsingContext context, ParseTreeNode treeNode)
override void EvaluateNode(EvaluationContext context, AstMode mode)
static string ErrInvalidEmbeddedPrefix
Looks up a localized string similar to Invalid embedded expression. .
readonly LanguageData Language