You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel/Services/DOM/DSL/Contexts/TElementContext.cs

78 lines
2.8 KiB

using DOM.DSL.Model;
using DOM.DSL.Services;
using DOM.DSL.Tokens;
namespace DOM.DSL.Contexts
{
internal class TElementContext :
TContext
{
private readonly string _name;
private TToken _next;
public TElementContext(TContext parent, string name)
{
ParentContext = parent;
_name = name;
}
public override void Read(TStringReader reader)
{
if (reader.EOF == false && reader.Current == TChar.PropertyOrFuncStart)
{
if (reader.Move())
{
reader.SkipBreaks();
var name = reader.ReadIdentity();
if (false == string.IsNullOrWhiteSpace(name))
{
reader.Move(name.Length);
if (this._name.Equals("system"))
{
// Like a '@system.ignorespace'
if (reader.Current == TChar.FuncArgsStart)
{
reader.Move();
reader.SkipBreaks();
var context = new TFunctionContext(this, name);
context.Read(reader);
_next = new TSystemToken { Command = name, Arg = context.Complete() };
}
else
{
_next = new TSystemToken { Command = name, Arg = null! };
}
}
else
{
if (reader.Current == TChar.FuncArgsStart)
{
// Function '@now.format(dd-mm)'
reader.Move();
var context = new TFunctionContext(this, name);
context.Read(reader);
_next = context.Complete();
}
else
{
// Property '@now.year'
var context = new TPropertyContext(this, name);
context.Read(reader);
_next = context.Complete();
}
}
}
else
{
_next = new TTextToken { Text = TChar.PropertyOrFuncStart + name };
}
}
}
}
public TToken Complete()
{
return new TElementToken { ElementName = _name, NextToken = _next?.Clone()! };
}
}
}

Powered by TurnKey Linux.