mirror of https://github.com/ogoun/Zero.git
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.
78 lines
2.8 KiB
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()! };
|
|
}
|
|
}
|
|
} |